如何使用 R 根据条件索引数据框的特定行和列?
How to index specific row and column of a dataframe by conditions using R?
我有两个不同维度的数据框;数据框 a 和数据框 b。 我想用存储在数据帧 b 中的字段值替换数据帧 a 中的特定字段。我找到了一种方法来过滤我想用来替换数据框 a 字段的数据框 b 的值。但是,我不知道如何索引数据框的特定字段 a 使用条件来替换那里的值...有什么建议吗?
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
鉴于您对 R 比较陌生,我将尝试给出一个完整的答案:
我强烈建议不要到处使用 base::
,原因有二:1) 没有人会卸下 base
包,并且 b) 它看起来很可怕。
我想我理解你的意图并且你会同意我们应该努力保持代码尽可能干净和易读(针对 find/avoid 个错误)
但是这种风格的选择让它变得更加罗嗦而没有任何好处......
事实上,它使代码更难阅读和理解(正如评论者已经指出的,这几行代码中存在多个错误。并且有
仍然 示例中的错误(即没有名为“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,引入错误的方式更少...
对于第二个作业,您使用 seq
和 matrix
这可能很有用。虽然我不觉得有必要
这里(同样,显式优于隐式)但是这里不需要 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>
在您写的评论中 是由不同的变量组合而成的,例如< col> 和 <3> 然后你使用 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
来检索满足条件的元素的索引,我们直接将列名指定为字符串,我会建议研究 ?Extract
它是 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,明确是更好 ;)
我有两个不同维度的数据框;数据框 a 和数据框 b。 我想用存储在数据帧 b 中的字段值替换数据帧 a 中的特定字段。我找到了一种方法来过滤我想用来替换数据框 a 字段的数据框 b 的值。但是,我不知道如何索引数据框的特定字段 a 使用条件来替换那里的值...有什么建议吗?
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
鉴于您对 R 比较陌生,我将尝试给出一个完整的答案:
我强烈建议不要到处使用 base::
,原因有二:1) 没有人会卸下 base
包,并且 b) 它看起来很可怕。
我想我理解你的意图并且你会同意我们应该努力保持代码尽可能干净和易读(针对 find/avoid 个错误)
但是这种风格的选择让它变得更加罗嗦而没有任何好处......
事实上,它使代码更难阅读和理解(正如评论者已经指出的,这几行代码中存在多个错误。并且有
仍然 示例中的错误(即没有名为“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,引入错误的方式更少...
对于第二个作业,您使用 seq
和 matrix
这可能很有用。虽然我不觉得有必要
这里(同样,显式优于隐式)但是这里不需要 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>
在您写的评论中 是由不同的变量组合而成的,例如< col> 和 <3> 然后你使用 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
来检索满足条件的元素的索引,我们直接将列名指定为字符串,我会建议研究 ?Extract
它是 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,明确是更好 ;)