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