根据其他三列中的值设置 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","recency","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" & Recency == "0-12 Mths"
、Flag == "yes" & Recency == "12-24 Mths"
、Flag == "no" & Recency == "0-12 Mths"
和Flag == "no" & 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 列中的值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?