我有几个数据框的列表,每个数据框有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循环重构数据帧列表?有什么想法吗?
感谢。
答案 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