如何解决以特殊方式获取长格式
我有一个很宽格式的数据集,我希望它是一个长格式。通常,在这种情况下我会使用melt,但是在这里我不知道这是否可行。那是我的数据集:
> Data <-
+ data.table(
+ ID = 1:6,+ N1 = round(rnorm(6)),+ E1 = round(rnorm(6)),+ N2 = round(rnorm(6,5)),+ E2 = round(rnorm(6,+ Class1 = 1,+ Class2 = 2
+ )
>
> Data
ID N1 E1 N2 E2 Class1 Class2
1: 1 0 0 4 5 1 2
2: 2 -1 0 5 5 1 2
3: 3 0 -1 5 5 1 2
4: 4 1 0 5 5 1 2
5: 5 -1 -1 4 7 1 2
6: 6 -2 -1 6 6 1 2
我想要的数据集是一个:
> Data.Long <-
+ rbind(
+ Data[,.(ID,N = N1,E = E1,Class = Class1)],+ Data[,N = N2,E = E2,Class = Class2)]
+ )
> Data.Long
ID N E Class
1: 1 0 0 1
2: 2 -1 0 1
3: 3 0 -1 1
4: 4 1 0 1
5: 5 -1 -1 1
6: 6 -2 -1 1
7: 1 4 5 2
8: 2 5 5 2
9: 3 5 5 2
10: 4 5 5 2
11: 5 4 7 2
12: 6 6 6 2
在这种情况下,我尝试使用rbind
和变量选择是完全可以的。但是在我的真实数据集中,我有更多类似ID
的变量,并且可能有两个以上的类。您能想到即使有很多类也不会重复的更好的代码吗?
解决方法
我们可以使用pivot_longer
中的tidyr
:
tidyr::pivot_longer(Data,cols = -ID,names_to = '.value',names_pattern = '([A-Za-z]+)')
# ID N E Class
# <int> <dbl> <dbl> <dbl>
# 1 1 0 0 1
# 2 1 5 6 2
# 3 2 -1 -2 1
# 4 2 6 6 2
# 5 3 2 0 1
# 6 3 6 5 2
# 7 4 0 0 1
# 8 4 4 6 2
# 9 5 -2 1 1
#10 5 5 6 2
#11 6 -1 0 1
#12 6 6 5 2
.value
在pivot_longer
中有特殊含义,这意味着长格式的新列将具有原始列名称中的名称。这些名称的派生方式是使用names_pattern
参数定义的。在names_pattern
中,我们提到了从名称中提取所有字符([A-Za-z]+
)作为新名称。因此N1
,N2
成为N
,它们被合并为一列。 E1
,E2
和Class1
,Class2
对也是如此。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。