首页 文章

R在数据帧列表中进行变异

提问于
浏览
3
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?

2 回答

  • 7

    你似乎走在正确的轨道上,但你替换原始列表元素的方式有点不对劲 . 虽然有多种方法可以实现,但以下是您开始使用的领域:

    for-loop

    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

    lapply(ldf, function(x) {
        mutate(x,
               new_col_one=first/(second * 2),
               new_col_two=first/(second * 3))
    })
    

    这将创建一个新列表

    Map

    Map(function(x) {
        mutate(x,
               new_col_one=first/(second * 2),
               new_col_two=first/(second * 3))
    }, ldf)
    

    这也将创建一个新列表 .

    您还可以从 purrr 包中查看map .

    我希望其中一个有用 .

  • 3

    这是 map 的选项 tidyverse

    library(tidyverse)
    ldf %>%
       map(~mutate(., NewColumn1 = first/(second*2), NewColumn2 = first/(second*3)))
    

相关问题