【问题标题】:Create a new column in R dataframe based on an existing column and a set of parameters根据现有列和一组参数在 R 数据框中创建一个新列
【发布时间】:2017-09-26 11:58:59
【问题描述】:

我有以下数据框 - 称之为 A

S.No    Action Taken
1   Advance Booking
2   Before Launch
3   After Launch
4   Re Launch
5   Customer care management

我也有以下数据框 - 称之为 B

Sl No   Action Name
1       Machine Re Launch
2       New Machine Re Launch
3       New Machine Relaunch
4       New Device Launch
5       New Device After Launch
6       Customer Care Management'
7       Machine After Launch
8       New   Machine After Launch
9       New   Machine Relaunch
10      New   Device After Launch

如何在数据集B中创建一列如下-

 Sl No  Action Name                Action Type
1       Machine Re Launch           Re Launch
2       New Machine Re Launch       Re Launch
3       New Machine Relaunch        Re Launch
4       New Device Launch           Launch
5       New Device After Launch     After Launch
6       Customer Care Management'   Customer Care Management
7       Machine After Launch        After Launch 
8       New   Machine After Launch  After Launch
9       New   Machine Relaunch      After Launch
10      New   Device After Launch   After Launch

我该如何做到这一点。这类似于在 Excel 中查找。

【问题讨论】:

  • 负责修剪“Action name”的算法是什么?你试过什么?考虑发布reproducible example
  • 动作名称是作为数据字典的一部分提供的——我没有通过任何代码派生它。我尝试过 Strsplit,但结果有限,因为在某些情况下,字典中的关键字位于字符串之间。它看起来像一个查找,但到目前为止我只找到了数字示例。因此我的查询

标签: r dataframe character lookup


【解决方案1】:

是否由于您的示例中的拼写错误,B 数据框将其拼写为“重新启动”但 A 表示“重新启动”?在没有任何进一步信息的情况下,我看不出你期望它如何匹配这两者。

假设这是一个错误,你可以这样做,

B$action_type <- ""
for (i in A$action_taken) {
  B$action_type <- ifelse(B$action_type == "",
                                      ifelse(grepl(i,
                                                  B$action_name, 
                                                  ignore.case = TRUE),
                                             i,
                                             ""),
                                      B$action_type)
}

这只是遍历 Actions Taken 列表,查看是否在 Action Name 中找到文本,如果找到,则将其作为 Action Type 输出(如果没有,则将其留空并移至下一个字符串) .不过,这只会找到准确的拼写(忽略大小写),因此“Relaunch”和“Re Launch”不匹配。

编辑

添加新的回复以反映下面的评论。

如果您希望能够处理所有版本的“重新启动”/“重新启动”等,我认为您必须制作一个您期望的所有变体的查找表,以及它们对应的正确“采取的行动”第二列。

因此,A 数据框现在同时包含 action_text_variationaction_taken 列,其中 action_text_variation 包含所有要查找的文本,而 action_taken 具有您要填充“action_type”的相应文本。

现在我们遍历 A 中的行数。

B$action_type <- ""
for (i in 1:nrow(A)) {
  B$action_type <- ifelse(B$action_type == "",
                                      ifelse(grepl(A$action_text_variation[i],
                                                  B$action_name, 
                                                  ignore.case = TRUE),
                                             A$action_taken[i],
                                             ""),
                                      B$action_type)
}

附:如果您发布了一个可重现的示例,那么帮助您会容易得多,这样我们就可以自己运行代码并提出更改建议。

【讨论】:

  • 谢谢。它实际上不是拼写错误,但我可以再次用正确的版本替换它。我被要求避免 R 中的循环,因为它们可能会出现问题。
  • for 循环在 R 中肯定会出现问题,但我认为如果您了解它们为什么会成为问题(例如避免将 for 循环的输出附加到数据帧),则可以避免这种情况。但它们本质上并不坏,并且有它们的用途。这并不是说没有更好的非循环方式来解决您的问题:) 但这就是我的做法。我将编辑原始回复以反映您可以处理重新启动以及“重新启动”的问题。
  • 尊敬的先生。谢谢你。是否有循环和控制语句的教程/资源。我已经学习了基础知识,但对更大的循环感到困惑。
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2021-11-10
  • 2011-10-19
  • 2022-01-23
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
相关资源
最近更新 更多