2017-09-26 66 views
-1

中的R数据帧的新列我有以下dataframe-称它为创建基于现有列和一组参数

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中查找类似。

+2

负责修剪“动作名称”的算法是什么?你有什么尝试?考虑发布一个[可重现的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 –

+0

操作名称是作为数据字典的一部分提供的 - 我没有通过任何代码推导出它。我试过了Strsplit,但是它的结果是有限的,因为在某些情况下,字典中的关键字来自字符串之间。它看起来像查找,但我到目前为止只能找到数字示例。因此我的查询 –

回答

0

是否由于您的示例中的拼写错误,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) 
} 

这只是通过采取列表中的动作迭代,查找是否发现在操作名称的文本,如果这样做,那么它将输出为Action Type(如果不是,则将其保留为空并移至下一个字符串)。这只能找到确切的拼写(忽略大小写),所以“重新启动”和“重新启动”不匹配。

编辑

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

如果你想能够处理所有版本的“重新启动”/“重新启动”等,我认为你必须做一个你期望的所有变化的查找表,以及他们相应的正确的“采取行动”在第二列。

所以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) 
} 

附注:通过行数迭代如果您发布了一个可重复的示例,那么帮助您会容易得多,因此我们可以自行运行代码并提出更改建议。

+0

谢谢。它实际上不是一个拼写错误,但我可以再次替换正确的版本。我被要求避免R中的循环,因为它们可能有问题。 –

+0

for循环在R中肯定会有问题,但我认为如果你明白为什么它们是一个问题(如避免将for循环输出附加到数据框),那么可以避免它。但它们本质上并不坏并有其用途。这并不是说没有更好的非循环方式来解决你的问题:)但这是我该怎么做。 我会编辑原始回复以反映您可以处理重新启动以及“重新启动”的问题。 –

+0

亲爱的主席先生。谢谢。有没有教程/资源循环和控制语句。我已经学会了基本的知识,但是得到更大的循环。 –