R基于另一列的动态列名称
我有一张这样的桌子:R基于另一列的动态列名称,r,tidyr,R,Tidyr,我有一张这样的桌子: types <- c("ENR","ENR","ENR","ENR","ENR","ENR") records <- c(1,1,1,1,2,2) occur <- c(1,2,3,4,1,2) myval <- c("ABC|123","DEF|456","GHI|789","JKL|123","MNO|456","PQR|789") mydf <- data.frame(types, records, occur, myval) ty
types <- c("ENR","ENR","ENR","ENR","ENR","ENR")
records <- c(1,1,1,1,2,2)
occur <- c(1,2,3,4,1,2)
myval <- c("ABC|123","DEF|456","GHI|789","JKL|123","MNO|456","PQR|789")
mydf <- data.frame(types, records, occur, myval)
type record occur myval
ENR 1 1 ABC|123
ENR 1 2 DEF|456
ENR 1 3 GHI|789
ENR 1 4 JKL|123
ENR 2 1 MNO|456
ENR 2 2 PQR|789
。。。。但是,我希望列名基于发生#是动态的,因此理想情况下我希望这样:
types records occur letters1 numbers1 letters2 numbers2 letters3 numbers3 letters4 numbers4
ENR 1 1 ABC 123
ENR 1 2 DEF 456
ENR 1 3 GHI 789
ENR 1 4 JKL 123
ENR 2 1 MNO 456
ENR 2 2 DEF 456
你知道如何做到这一点吗?我在想,如果我能动态地命名可能有用的列?您可以使用
tidyr::spread()
为了保持原始occure
变量为三倍,然后使用spread()
函数,根据occure值旋转字母和数字的值
请注意,使用sep
参数将键和值粘贴到新变量名中。fill
参数仅用于获得所需的输出
types records occur letters_1 letters_2 letters_3 letters_4 numbers_1 numbers_2 numbers_3 numbers_4
1 ENR 1 1 ABC 123
2 ENR 1 2 DEF 456
3 ENR 1 3 GHI 789
4 ENR 1 4 JKL 123
5 ENR 2 1 MNO 456
6 ENR 2 2 PQR 789
我们可以使用
data.table
中的dcast
,它可以接受多个value.var
列
library(data.table)
dcast(setDT(mydf), types + records + occur ~ occur, value.var = c("letters", "numbers"), fill="")
# types records occur letters_1 letters_2 letters_3 letters_4 numbers_1 numbers_2 numbers_3 numbers_4
#1: ENR 1 1 ABC 123
#2: ENR 1 2 DEF 456
#3: ENR 1 3 GHI 789
#4: ENR 1 4 JKL 123
#5: ENR 2 1 MNO 456
#6: ENR 2 2 PQR 789
请看一下
?tidyr::spread
和?data.table::dcast
完美,谢谢!然而,我必须承认,尽管我在发布这个问题之前已经想了很多,但我现在还不确定。我现在想我希望每个记录只有一行:所以记录1将用4组字母和数字列进行解析。记录2将解析出填充字母1和2以及数字1和2,但将3和4保留为空。。。。嗯。不管怎样-谢谢你,你的解决方案对我来说非常有效@fleetmack从你的评论来看还不清楚。你能把它作为一个新的问题吗?如果这符合一套新的规则。我现在正在整理一些数据上的零散部分,如果我想不出来,我会发布一个新的问题。再次感谢!
mydf %>% dplyr::mutate(letters_ = occur, numbers_ = occur) %>%
spread(letters_, letters, fill = "", sep = "") %>%
spread(numbers_, numbers, fill = "", sep = "")
types records occur letters_1 letters_2 letters_3 letters_4 numbers_1 numbers_2 numbers_3 numbers_4
1 ENR 1 1 ABC 123
2 ENR 1 2 DEF 456
3 ENR 1 3 GHI 789
4 ENR 1 4 JKL 123
5 ENR 2 1 MNO 456
6 ENR 2 2 PQR 789
library(data.table)
dcast(setDT(mydf), types + records + occur ~ occur, value.var = c("letters", "numbers"), fill="")
# types records occur letters_1 letters_2 letters_3 letters_4 numbers_1 numbers_2 numbers_3 numbers_4
#1: ENR 1 1 ABC 123
#2: ENR 1 2 DEF 456
#3: ENR 1 3 GHI 789
#4: ENR 1 4 JKL 123
#5: ENR 2 1 MNO 456
#6: ENR 2 2 PQR 789