我有一个名为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
答案 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)]