我读过csv文件,其中包含以下格式的数据:
A 0.1
B 0.2
C .1,.2,.4,.6
D .1,.2,.4,.6
E 0.2
我想将其设置为:
A B C D E
0.1 0.2 0.1 0.1 0.2
0.2 0.2
0.4 0.4
0.6 0.6
我正在使用代码:
test <- read.csv("test.csv")
test_t <- setNames(data.frame(t(test[,-1])), test[,1])
给出错误:
setNames(data.frame(t(test [, - 1])),test [,1])出错:
的长度相同
'names'属性[4]的长度必须与vector [1]
答案 0 :(得分:2)
使用:
library(splitstackshape)
dcast(cSplit(df, 'V2', ',','long'), rowid(V1) ~ V1)[,-1]
给出:
A B C D E 1: 0.1 0.2 0.1 0.1 0.2 2: NA NA 0.2 0.2 NA 3: NA NA 0.4 0.4 NA 4: NA NA 0.6 0.6 NA
没有额外包裹的解决方案:
splt <- strsplit(as.character(df$V2),',')
df2 <- data.frame(V1 = rep(df$V1, lengths(splt)),
V2 = as.numeric(unlist(splt)),
id = unlist(lapply(splt, seq_along)))
df3 <- reshape(df2, idvar = 'id', timevar = 'V1', direction = 'wide')
给出了类似的结果:
> df3 V2.A V2.B V2.C V2.D V2.E 1 0.1 0.2 0.1 0.1 0.2 4 NA NA 0.2 0.2 NA 5 NA NA 0.4 0.4 NA 6 NA NA 0.6 0.6 NA
如果您想获得与第一个解决方案完全相同的列名:
names(df3) <- gsub('V2.', '', names(df3), fixed = TRUE)