【问题标题】:select rows by value from a data frame in a list to assign new value r从列表中的数据框中按值选择行以分配新值 r
【发布时间】:2018-08-15 23:10:50
【问题描述】:

如何在列表中按值选择数据框的行并将新值分配给特定列?

当我运行这段代码时:

df <- data.frame(x = c(10,55,32,78,47, NA),
                 y = c("a", "a", "b", "b", "c", "d"))

df1 <- data.frame(x = c(7.3,5.65,3.72,7.81,4.79, NA),
                 y = c("a", "a", "b", "b", "c", "d"))

dat <- list("df" = df, "df1" = df1)

dat[['df']]['y' == "d", 1] <- 15

值 15 分配给列 xy 的所有值。

我只希望y == "d" 的列x 在数据框df 中为15。我不想将 2 个数据框的列表转换为 2 个单个数据框,而是从列表中的数据框 df 中选择 y == "d" 所在的行。我怎么能这样做?

【问题讨论】:

    标签: r list select


    【解决方案1】:

    我们可以使用lapply 来循环遍历list,提取'y' 为“d”的列'x'并将其分配给15;确保之后返回整个数据集

    lapply(dat, function(v) {
             v$y <- as.character(v$y)
             v$x[v$y =="d"] <- 15
         v})
    

    如果分配需要仅针对特定数据集

    dat$df$x[dat$df$y=="d"] <- 15
    

    另外,如果需要通过检查listnames 来完成分配,则循环通过names 然后执行分配

    for(nm in names(dat)) if(nm == "df") dat[[nm]]$x[dat[[nm]]$y=='d'] <- 15
    

    【讨论】:

    • 实际上我需要将列转换为字符。此外,y == d 出现在列表中的两个数据框中。我会编辑我的帖子。
    • @yPennylane 更新帖子。您可以在使用stringsAsFactors = FALSE 构造data.frame 时轻松完成此操作。 y == d 可以出现在 n 中的 list 数据集数量中,它不会对代码产生任何影响
    • 我测试了你的代码。数据框df1y == d 行的x 也变为15。如何将15 分配给数据框y == d 数据框df 中的x 行,而不是df1
    • @yPennylane 你的意思是只对list中的特定数据集执行此操作?
    • 是的,仅在 list 中的特定数据集 (df) 上
    【解决方案2】:

    你也可以试试 tidyverse

    library(tidyverse)
    map(dat, ~mutate(., x = ifelse(y == "d", 15, x)))
    $df
       x y
    1 10 a
    2 55 a
    3 32 b
    4 78 b
    5 47 c
    6 15 d
    
    $df1
         x y
    1 7.30 a
    2 5.65 a
    3 3.72 b
    4 7.81 b
    5 4.79 c
    

    【讨论】:

      【解决方案3】:

      这将帮助您将 NA 替换为 15。 dat[[1]][1][6,]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        相关资源
        最近更新 更多