Rol*_*and 2 r reshape dataframe
我有一个data.frame变量是一个向量(或列表),如下所示:
MyColumn <- c("A, B,C", "D,E", "F","G")
MyDF <- data.frame(group_id=1:4, val=11:14, cat=MyColumn)
# group_id val cat
# 1 1 11 A, B,C
# 2 2 12 D,E
# 3 3 13 F
# 4 4 14 G
Run Code Online (Sandbox Code Playgroud)
我想要一个新的数据框,其中包含与向量一样多的行
FlatColumn <- unlist(strsplit(MyColumn,split=","))
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
MyNewDF <- data.frame(group_id=c(rep(1,3),rep(2,2),3,4), val=c(rep(11,3),rep(12,2),13,14), cat=FlatColumn)
# group_id val cat
# 1 1 11 A
# 2 1 11 B
# 3 1 11 C
# 4 2 12 D
# 5 2 12 E
# 6 3 13 F
# 7 4 14 G
Run Code Online (Sandbox Code Playgroud)
实质上,对于作为MyColumn(字母A到G)列表元素的每个因素,我想分配列表的相应值.每个因素只出现一次MyColumn.
这种重塑/不列名/合并是否有一种巧妙的方法?我想出了一个非常麻烦的for循环,它的行数MyDF 和相应元素的长度strsplit(MyColumn,split=",").我非常肯定必须有更优雅的方式.
您可以使用separate_rows从tidyr:
tidyr::separate_rows(MyDF, cat)
# group_id val cat
# 1 1 11 A
# 2 1 11 B
# 3 1 11 C
# 4 2 12 D
# 5 2 12 E
# 6 3 13 F
# 7 4 14 G
Run Code Online (Sandbox Code Playgroud)
怎么样
lst <- strsplit(MyColumn, split = ",")
k <- lengths(lst) ## expansion size
FlatColumn <- unlist(lst, use.names = FALSE)
MyNewDF <- data.frame(group_id = rep.int(MyDF$group_id, k),
val = rep.int(MyDF$val, k),
cat = FlatColumn)
# group_id val cat
#1 1 11 A
#2 1 11 B
#3 1 11 C
#4 2 12 D
#5 2 12 E
#6 3 13 F
#7 4 14 G
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3685 次 |
| 最近记录: |