将一个细胞固定在不同的细胞上

时间:2017-06-02 20:04:04

标签: r dataframe reshape

我读过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]

的长度相同

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)