【问题标题】:Deleting column across data frames depending on location根据位置跨数据框删除列
【发布时间】:2015-07-06 16:06:29
【问题描述】:

我有一组数据框对应下面的示例:

df1 <- data.frame(id=1:10, relevant_values=11:20, rubbish = runif(n = 10), 
                  important_as_well = 11:20)
df2 <- data.frame(id=1:10, something_important=11:20, not_relevant = runif(n = 10))
df3 <- data.frame(id=1:10, may_be_valid=11:20, nonsense = runif(n = 10),
                  crucial=11:20)

我想循环浏览这些数据集并删除rubbishnot_relevantnonsense 列。这些列在数据集中始终位于同一位置,3,如上例所示,但名称不同。

【问题讨论】:

    标签: r list dataframe apply


    【解决方案1】:

    您可以使用负索引删除第三列:

    df1 <- df1[, -3]
    df2 <- df2[, -3]
    df3 <- df3[, -3]
    

    我建议不要以编程方式循环访问和访问这些变量,如果您想对每个变量执行相同的操作,建议您将它们保存在一个列表中。但是,如果您确实想访问它们,可以使用getassign

    var_names <- paste0("df", 1:3)
    lapply(var_names, function(n) assign(n, get(n)[, -3]))
    

    【讨论】:

    • 我正要说“或使用列表”:) 与您的方法类似的是l &lt;- mget(ls(pattern = "^df\\d+")); l &lt;- lapply(l, [, -3)
    • 谢谢,我同意原则上,从循环中的所有数据帧中删除变量不是最安全的选择,但是,在这种特殊情况下,数据帧是使用不需要的变量自动生成的总是插入df,因此我希望使用循环。
    • @Konrad 为什么不将自动生成的数据框设置为存储在列表中?
    • 绝对可以,每个df 都是通过read.csv 导入的,所以我可以在循环中运行它来导入字符串,然后应用函数来删除列。
    • @Konrad 是的,我也会这样做。使用 lapply 比循环更容易:dfs &lt;- lapply(file_names, read.csv, ...)(其中 ... 具有控制 read.csv 的额外参数)
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多