微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以特殊方式获取长格式

如何解决以特殊方式获取长格式

我有一个很宽格式的数据集,我希望它是一个长格式。通常,在这种情况下我会使用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

.valuepivot_longer中有特殊含义,这意味着长格式的新列将具有原始列名称中的名称。这些名称的派生方式是使用names_pattern参数定义的。在names_pattern中,我们提到了从名称中提取所有字符([A-Za-z]+)作为新名称。因此N1N2成为N,它们被合并为一列。 E1E2Class1Class2对也是如此。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。