【问题标题】:R: Assign values to a new column based on values of another column where a condition is satisfiedR:根据满足条件的另一列的值将值分配给新列
【发布时间】:2016-04-15 07:40:37
【问题描述】:

我想在 data.frame 中创建一个新列,其值等于另一个 data.frame 中的值,其中每个数据框的两列之间满足特定条件。

R 伪代码是这样的:

DF1$Activity <- DF2$Activity where DF2$NAME == DF1$NAME

在每个 data.frame 中,$NAME 的值在列中是唯一的。

【问题讨论】:

  • 请与预期的输出一起分享一个最小的可重现示例。
  • 好的,对于这个问题,你可以在 R 中做一些操作,得到预期的输出。

标签: r dataframe


【解决方案1】:

我不确定这个是否真的需要一个例子。当您创建具有一组 NA 值的列,然后在两侧分配具有相同逻辑向量的所需行时会发生什么:

DF1$Activity <- NA
DF1$Activity[DF2$NAME == DF1$NAME] <- DF2$Activity[DF2$NAME == DF1$NAME]

【讨论】:

  • 我认为 OP 要求以更规范的方式编写此内容,最好不要重复条件。
【解决方案2】:

使用ifelse 函数。在这里,当条件不满足时,我放 NA 。但是,您可以从任何向量中选择任何一个或多个值。 回收规则1申请。

DF1$Activity <- ifelse(DF2$NAME == DF1$NAME, DF2$Activity, NA)

【讨论】:

  • 我认为OP希望在不满足条件时不更改左侧列。所以NA 应该是DF1$Activity
【解决方案3】:

没有例子很难说。但从您的描述来看,这听起来像是base::mergedplyr::inner_join 操作。与if 语句相比,这些速度相当快。

干杯

【讨论】:

  • 两种方法(base::mergedplyr::inner_join)都有效。列名不正确时出现了轻微的问题,但在合并之前使用rename(DF2, c("NAME"="xy.NAME")) 解决了这些问题,并在merge 调用中使用by="xy.NAME" 或对inner_join 使用by 参数,即ij &lt;- inner_join(DF1, DF2, by = c("xy.NAME" = "NAME"))
猜你喜欢
  • 1970-01-01
  • 2023-02-15
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
相关资源
最近更新 更多