使用列索引重塑数据帧列表

时间:2013-12-31 15:10:40

标签: r reshape

我有几个数据框的列表,每个数据框有3列,我想重新整理它们。每个数据框都有不同的列名(我试图改变所有df的colnames但没有成功,但这是另一个SO问题:)),所以我必须索引列而不是使用列名。

我可以用lapply得到我想要的东西:

df = lapply(df, function(x) reshape(x, v.names = 1, idvar = 3, timevar = 2, direction ="wide"))

其中1,2和3是我想要使用的df列。但出于好奇,我试图使用for循环做同样的事情,但我无法做到。

for (i in length(df)){
df[[i]] <- reshape(df[[i]], v.names = 1, idvar = 3, timevar = 2, direction = "wide")
}

这没有任何作用。鉴于我不能使用列名,我不知道如何指定列。例如:

for (i in length(df)){
df[[i]] <- reshape(df[[i]], v.names = df[[i]][,1], idvar = df[[i]][,3], timevar = df[[i]][,2], direction = "wide")
}

Error in `[.data.frame`(data, , idvar) : undefined columns selected

那么,如何使用列索引使用for循环重构数据帧列表?有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

问题在于你的代码

for (i in length(df))

这只会传递一次i =列表的最后一个成员。只是尝试将length(df)放到控制台 - 它只输出一个数字。你想要一个数字1,2,...,长度(df)的向量,所以你想要1:length(df)

for (i in 1:length(df))

另一个选项(如@ *船注明)是seq_along(df)。这更安全 - 如果未定义df,它将生成空向量,与上述方法不同。但我更喜欢上述符号,这只是一个背景和个人偏好的问题。

答案 1 :(得分:0)

我将尝试解决这两个问题(重塑和更改df列表的名称)。

data(Indometh)
names(Indometh)
## [1] "Subject" "time"    "conc"

### create a list of df
dflist <- lapply(1:3, function(x) Indometh)

### changing the name of df
dflist <- lapply(dflist, setNames,
                 c("subject", "timevar", "conc"))

### Reshaping the data using colnames
dflist <- lapply(dflist, function(df)
                 reshape(df,
                         v.names = "conc",
                         idvar = "subject",
                         timevar = "timevar",
                         direction = "wide")
                 )

str(dflist, max.level = 1)
## List of 3
##  $ :Classes ‘nfnGroupedData’, ‘nfGroupedData’, ‘groupedData’ and 'data.frame':   6 obs. of  12 variables:
##   ..- attr(*, "reshapeWide")=List of 5
##  $ :Classes ‘nfnGroupedData’, ‘nfGroupedData’, ‘groupedData’ and 'data.frame':   6 obs. of  12 variables:
##   ..- attr(*, "reshapeWide")=List of 5
##  $ :Classes ‘nfnGroupedData’, ‘nfGroupedData’, ‘groupedData’ and 'data.frame':   6 obs. of  12 variables:
##   ..- attr(*, "reshapeWide")=List of 5