根据其他三列中的值设置 R 列中的值

Posted

技术标签:

【中文标题】根据其他三列中的值设置 R 列中的值【英文标题】:Set the values in an R column based on values in three other columns 【发布时间】:2017-07-13 06:36:37 【问题描述】:

在我从 R 导出并在 Excel 中手动添加 Segment 列之后,我有一些看起来像这样的原始数据。

将原始数据提取到 excel 中

我想用 R 编写代码,为我添加 Segment。

数据描述...

ID: Random distinct numbers
flag: Yes or No
Period: 0-12 Mths or 12-24 Mths
Spend Group: High, Medium or Low

规则...

Flag = Yes
Period = 0-12 Mths
Spend Group = High
Then Segment = G01

Flag = Yes
Period = 0-12 Mths
Spend Group = Medium
Then Segment = G02

Flag = Yes
Period = 0-12 Mths
Spend Group = Low
Then Segment = G03

Flag = Yes
Period = 12-24 Mths
Spend Group = High
Then Segment = G04

...以此类推,直到所有变量都被考虑在内

我希望代码能够在每次处理数据时识别差异,例如,标志并不总是是或否。有时每行都是是。

我总结的完整数据集如下图所示。

汇总数据

您将如何开始在 R 中编写此代码?

【问题讨论】:

首先,您需要将其保存为 CSV,然后将其作为带有 df <- read.csv("C:/Users/you/path_to_file/file.csv") 的数据框读入 R。之后,我建议您阅读 R 教程。这是您将首先学习的内容之一 谢谢@rsoren。我已经拥有 R 中的所有数据,这是处理的最后一步。我不想输入规则,因为可能有比上面显示的更多的变量。理想情况下,我想为每个条件创建向量或类似的东西,并将它们用作规则的主干,例如 flag 你有没有尝试过?一个用户阵营可能会建议使用dplyr 管道,而其他用户则会使用data.table 示例来反驳。它也可以在 R 中直接完成,可能使用ifelse 或其他基于向量的操作。不过,首先,如果我们有一些数据可供使用,那么制作东西会简单得多,而且我不倾向于从图像中转录。在help/mcve 和a popular q/a 有关于制作好问题的好建议。 【参考方案1】:

在我的头上合并似乎是正确的方法。

combine = merge(raw_data, summary_data, by.x=c("flag","period","spend_group"), by.y =c("flag","re​​cency","spend_band"))

【讨论】:

@Super_Si 如果对您有帮助,请接受答案作为解决方案 见上面的数据链接。我认为我需要尝试这样的事情,因为每次加载数据时我的值都会发生变化,并且使用字段名称而不是为每个结果编写值会考虑到这一点。只是不知道该怎么做!【参考方案2】:

要扩展我上面的评论(对不起,我很着急),我建议将您的规则放在 csv 中(或仅定义为数据框,但如果他们要更改 csv 可能是最简单的)并将它们作为单独的 data.frame 读入,例如下面。这将具有标志、周期和支出组的每个组合以及您要分配给每个组合的细分。

假设您的数据(使用 colnames “Unique.ID”、“flag”、“period”、“spend_group”)在 df 中

library(dplyr)
df_withSegment <- left_join(df, rules)

因为 "flag","period","spend_group" 是所有具有通用名称的列,它将在规则中将 Segment 的值分配给这三个列的每个组合。

规则,例如数据框(来自 csv 或 R)

【讨论】:

这工作得很好... finaldf 【参考方案3】:

我会用四步法ifelse()

您在Flag == "yes" &amp; Recency == "0-12 Mths"Flag == "yes" &amp; Recency == "12-24 Mths"Flag == "no" &amp; Recency == "0-12 Mths"Flag == "no" &amp; Recency == "12-24 Mths" 四个子集中引用您的数据并启动ifelse() 调用:

mydata$Segment[mydata$Flag == "yes" & mydata$Recency == "0-12 Mths"] <- with(mydata[mydata$Flag == "yes" & mydata$Recency == "0-12 Mths", ], 
  ifelse(Spend Band == "High", "G01", 
     ifelse(Spend Band == "Medium", "G02", "G03")))

mydata$Segment[mydata$Flag == "yes" & mydata$Recency == "12-24 Mths"] <- with(mydata[mydata$Flag == "yes" & mydata$Recency == "12-24 Mths", ], 
  ifelse(Spend Band == "High", "G04", 
     ifelse(Spend Band == "Medium", "G05", "G06")))

mydata$Segment[mydata$Flag == "no" & mydata$Recency == "0-12 Mths"] <- with(mydata[mydata$Flag == "no" & mydata$Recency == "0-12 Mths", ], 
  ifelse(Spend Band == "High", "G07", 
    ifelse(Spend Band == "Medium", "G08", "G09")))

mydata$Segment[mydata$Flag == "no" & mydata$Recency == "12-24 Mths"] <- with(mydata[mydata$Flag == "no" & mydata$Recency == "12-24 Mths", ], 
  ifelse(Spend Band == "High", "G10", 
    ifelse(Spend Band == "Medium", "G11", "G12")))

您将不得不更改变量名称,因为Spend Band 在 R 中不是一个可行的变量名称,因此我猜您的名称将被称为 Spend_Band 或类似名称。

【讨论】:

可能更容易使用选项和结果制作单独的数据框,并使用 dplyr::left_join() 来连接数据并给出 Segment 是的,很遗憾我并不精通 dplyr。 感谢您的评论。见上面的数据链接。我认为我需要使用@abishek 提供的答案之类的东西,因为每次加载数据时我的值都会发生变化,并且使用字段名称而不是为每个结果编写值会考虑到这一点。只是不知道该怎么做!

以上是关于根据其他三列中的值设置 R 列中的值的主要内容,如果未能解决你的问题,请参考以下文章

根据条件验证R中两个数据框之间的列中的值

如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?

熊猫数据框条件 .mean() 取决于特定列中的值

使用pandas创建稀疏矩阵,并使用来自.dat文件的其他两列的索引[x,y]的.dat文件的一列中的值填充它

根据 2 列和第三列中的条件删除重复行

根据其他列中的条件更新一列中的值