df<- data_frame(first =seq(1:10), second = seq(1:10))
ldf <- list(df, df, df, df, df)
names(ldf) <- c('alpha', 'bravo', 'charlie', 'delta', 'echo')
我有这个数据帧列表,我正在尝试将mutate函数应用于每个数据帧但是我得到了“与STRSXP不兼容”的错误,我很困惑。
这是我的代码,它给了我错误。
for( i in seq_along(ldf)){
ldf[[i]] <- mutate( ldf[[i]], NewColumn1= ldf[[i]][1]/(ldf[[i]][2] *2),
NewColumn2= ldf[[i]][1]/(ldf[[i]][2] * 3))
}
我的意图是for循环转到第一个数据帧。它应用mutate函数并创建一个名为“NewColumn1”的新列,该列将第一列除以第二列的两倍。它为下一栏做了类似的事情。
我是否使用此代码进入正确的球场,或者在列表中循环使用dfs时是否可以使用mutate?
答案 0 :(得分:9)
您似乎走在了正确的轨道上,但是您替换原始列表元素的方式有点错误。虽然有多种方法可以实现,但以下是您开始使用的领域:
for (df_name in names(ldf)) {
ldf[[df_name]] <- mutate(ldf[[df_name]],
new_col_one=first/(second * 2),
new_col_two=first/(second * 3))
}
这实际上会覆盖原始列表。
lapply(ldf, function(x) {
mutate(x,
new_col_one=first/(second * 2),
new_col_two=first/(second * 3))
})
这将创建一个新列表
Map(function(x) {
mutate(x,
new_col_one=first/(second * 2),
new_col_two=first/(second * 3))
}, ldf)
这也将创建一个新列表。
您还可以从purrr
包中查看map
。
我希望其中一个有用。
答案 1 :(得分:4)
以下是来自map
tidyverse
选项
library(tidyverse)
ldf %>%
map(~mutate(., NewColumn1 = first/(second*2), NewColumn2 = first/(second*3)))