取消列出数据库的列

时间:2014-09-05 10:22:33

标签: r

我有一个名为Returns的数据帧输出,有两列 - 日期和R1R2。第二列是一个列表,因为我无法对数据帧(包括write.table)执行任何进一步的操作。我如何将其转换为第一行为Date(与现在相同)的数据帧,以及第二行作为包含列表元素的向量。

例如:我的输出数据帧格式如下(第二列是列表):

Date            R1R2
22-06-2014      c(0.98,0.87,.96,.79)
23-08-2014      c(0.88,0.98,.67,.86)

是否可以将第二列转换为同一数据帧中的向量?

我尝试使用以下代码将列表转换为向量

a <- data.frame(matrix(nrow=0, ncol=2))
y <- vector()

for(i in 1:length(Returns$R1R2))
{   
   y[i] <- unlist(R1R2$x[i])
   a <- a[i, (y[i])]
}

但它给了我以下错误:

  Error in a[i, (y[i])] : incorrect number of dimensions
In addition: Warning messages:
1: In y[i] <- unlist(R1R2$x[i]) :
  number of items to replace is not a multiple of replacement length
2: In y[i] <- unlist(R1R2$x[i]) :
  number of items to replace is not a multiple of replacement length

任何人都可以帮助我。 或者将其拆分为多个列。例如:

Date           1        2     3      4
22/06/2014    0.98    0.87   .96   .79

3 个答案:

答案 0 :(得分:0)

df <- data.frame(Date=c("22-06-2014","23-08-2014"),
                 R1R2=I(list(c(0.98,0.87,.96,.79),c(0.88,0.98,.67,.86))))

df$R1R2 <- paste(unlist(df$R1R2),collapse=",") # converting list to a vector

library(splitstackshape)

df2 <- concat.split.multiple(df, split.cols = "R1R2", seps = ",") # splitting to multiple columns

答案 1 :(得分:0)

我的函数l2df可能有助于将列表转换为data.frame吗?

install.packages("berryFunctions")
library(berryFunctions)
?l2df

这些示例应该让您了解如何使用它。 然后,您可以使用

cbind( YourDateVector,  TheNewDFobtainedWithBerrysAwesomeHelperFunctionl2df  )

答案 2 :(得分:0)

这是data.table方法(以最佳速度提供所需的输出)

library(data.table)
setDT(df)[, list(R1R2 = unlist(R1R2)), by = Date]
#          Date R1R2
# 1: 22-06-2014 0.98
# 2: 22-06-2014 0.87
# 3: 22-06-2014 0.96
# 4: 22-06-2014 0.79
# 5: 23-08-2014 0.88
# 6: 23-08-2014 0.98
# 7: 23-08-2014 0.67
# 8: 23-08-2014 0.86

如果您有两列以上,并且想要取消列出R1R2并且所有其他列都与正确的R1R2值匹配,请使用这个很棒的cSplit函数(也使用data.table

library(devtools)
source_gist(11380733)
res <- cSplit(df, "R1R2", sep = ",", direction = "long")
res[, R1R2 := gsub("\\(|\\)|c|\\s", "", R1R2)]