【问题标题】:How to index specific row and column of a dataframe by conditions using R?如何使用 R 按条件索引数据框的特定行和列?
【发布时间】:2021-12-02 23:25:44
【问题描述】:

我有两个不同维度的数据框;数据帧 a 和数据帧 b。 我想用数据帧 b 中存储的字段值替换数据帧 a 中的特定字段。我找到了一种方法来过滤我想用来替换数据框 a 的字段的数据框 b 的值。但是,我不知道如何使用条件来索引数据框的特定字段以替换那里的值...有什么建议吗?

df_a <- base::cbind(base::as.data.frame(
                    base::matrix(c(3, 5, 6, 1, 23, 6, 7, 58, 9), ncol = 3)),
                    c('bli', 'bla', 'blub'))
# create dataframe a

base::colnames(df_a) <- c('col1', 'col2', 'col3', 'col4')
# set colnames of dataframe a

df_b <- base::as.data.frame(base::matrix(base::seq(1, 27, 3), ncol = 3, byrow = TRUE))
# create dataframe b

repl_val <- df_b[2, 2]
# replace value for dataframe a

spc_col1_val <- 5
# row to index dataframe a: column <col1> should have the value <5>
spc_col <- base::paste0('col', '1')
# column to index dataframe a: the specific column is combined out of different variables e.g. <col> and <3>

df_a[df_a$col1 == spc_col1_val, df_a$spc_col] <- repl_val
# THIS DOES NOT WORK

【问题讨论】:

  • df_b 未正确定义。缺少)。但即使您添加 ) 也无法解决问题。 df_b 将是带有单列的 data.frame,这意味着 repl_val 将是空的,因为没有记录 df_b[2, 2]
  • 为什么要“命名空间”基础包?这种风格有什么好处?
  • @Mischa 非常感谢您的评论,我更改了代码以使其有意义。
  • @dario 我正在尝试在 stackoverflow 上“命名空间”所有包以避免混淆。但是,你是对的,在这种情况下它是多余的,因为我没有加载更多的包......

标签: r dataframe variables indexing conditional-statements


【解决方案1】:

由于您似乎对 R 比较陌生,我将尝试给出一个完整的答案: 我强烈建议不要在任何地方使用base::,原因有两个:1) 没有人会卸载base 包,b) 它看起来很可怕。 我想我理解您的意图,并且您同意我们应该努力保持代码尽可能干净易读(以查找/避免错误) 但是这种风格选择让它更加罗嗦,没有任何好处…… 事实上,它使代码更难阅读和理解(正如评论者已经指出的那样,这几行代码中有多个错误。而且有 still 示例中的错误(即没有名为“spc_val_col1”的变量(您将其命名为“spc_col1_val”)) 使用更简洁的风格很有帮助!!

现在,如果您关心明确性,创建 df_a 的更简洁的方法是:

df_a <- data.frame(col1 = c(3, 5, 6),
                   col2 = c(1, 23, 6),
                   col3 = c(7, 58, 9),
                   col4 = c('bli', 'bla', 'blub'))

好处:一切都在那里,包括 colnames,无需进一步操作 df,引入错误的方法更少......

对于第二个作业,您可以使用 seqmatrix,这很有用。虽然我看不出有必要 这里(同样,显式优于隐式)但这里不需要 as.data.frame,只有 diff 是名称(无论如何都不会使用)

df_b <- data.frame(matrix(seq(1, 27, 3), ncol = 3, byrow = TRUE))
  
repl_val <- df_b[2, 2] # replace value for dataframe a
spc_col1_val <- 5 # row to index dataframe a: column <col1> should have the value <5>

在您写的评论中 是由不同的变量组合而成的,例如 和 但是你使用 paste0('col', '1') 我希望您能看到这是多么令人困惑(同样,如果我们关心清晰度,正确处理所有这些内容实际上会有所帮助...)

spc_col <- paste0('col', '1') # column to index dataframe a: the specific column is combined out of different variables e.g. <col> and <3> 

df_a 作业之前:

  col1 col2 col3 col4
1    3    1    7  bli
2    5   23   58  bla
3    6    6    9 blub

下一行有多个错误,但最重要的是:我们可以使用which 来检索满足条件的元素的索引,我们直接将列名指定为字符串,我建议查看@ 987654331@这是R中一个非常重要的功能!

df_a[which(df_a$col1 == spc_col1_val), spc_col] <- repl_val

df_a 分配之后:

  col1 col2 col3 col4
1    3    1    7  bli
2   13   23   58  bla
3    6    6    9 blub

请不要将批评视为敌意的表现。我认为您的意图是正确的,并且显然愿意投入工作。但我强烈建议专注于真正有用且重要的东西;)希望这对您有所帮助!

最后一点:如果您还包含所需输出的示例,那就太好了(我假设我展示的是您想要的,但是输出示例将消除所有歧义(agian,明确更好; )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2021-08-07
    • 2022-01-18
    • 2021-01-05
    相关资源
    最近更新 更多