我有一个这样的表:
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
我正在解析 myval 列,以便分隔字段获得自己的列,这是我到目前为止使用的内容
library(tidyr)
mydf <- mydf %>% separate(myval, c("letters","numbers"),"\\|")
这本质上是有效的,它创建了这个:
types records occur letters numbers
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
....但是,我希望列名称根据发生#是动态的,所以我理想地喜欢这样:
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
知道如何实现这一点吗?我在想是否可以动态命名可能有效的列?
最佳答案
我们可以使用 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
关于基于另一列的 R 动态列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41050676/