我的数据集包含多个财政年度(2013 财年、2014 财年和 2015 财年)以及不同地区的调查中提出的问题的分数和受访者总数。
我的目标是循环浏览 FY
列,并确定每个地区提出每个问题的时间。并将此信息存储在新列中。
这就是可重复样本的样子 -
testdf=data.frame(FY=c("FY13","FY14","FY15","FY14","FY15","FY13","FY14","FY15","FY13","FY15","FY13","FY14","FY15","FY13","FY14","FY15"),
Region=c(rep("AFRICA",5),rep("ASIA",5),rep("AMERICA",6)),
QST=c(rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",3)),
Very.Satisfied=runif(16,min = 0, max=1),
Total.Very.Satisfied=floor(runif(16,min=10,max=120)),
Satisfied=runif(16,min = 0, max=1),
Total.Satisfied=floor(runif(16,min=10,max=120)),
Dissatisfied=runif(16,min = 0, max=1),
Total.Dissatisfied=floor(runif(16,min=10,max=120)),
Very.Dissatisfied=runif(16,min = 0, max=1),
Total.Very.Dissatisfied=floor(runif(16,min=10,max=120)))
我首先通过连接 Region
和 QST
来创建 ID 列
library(tidyr)
testdf = testdf %>%
unite(ID,c('Region','QST'),sep = "",remove = F)
我的目标
1) 对于每个唯一的ID
,确定是否提出了给定的问题 -
a) 仅一年(2013 财年、2014 财年或 2015 财年)
b) 过去两年(仅限 2015 财年和 2014 财年)
c) 过去三年(2015 财年、2014 财年和 2013 财年)
d) 仅适用于 2013 财年和 2015 财年
我的尝试
对于这个问题,我尝试创建一个 for 循环
,对于每个唯一的 ID
,我首先将提出问题的每个 FY 的唯一出现次数存储在向量v
。然后,根据这些发生的情况,使用 IF 条件语句将注释分配给新创建的名为 Tally
的列。
for (i in unique(testdf$ID))
{
v=unique(testdf$FY)
if(('FY15' %in% v) & ('FY14' %in% v)) {
testdf$Tally=='Asked Over The Past Two Years'
}
else if(('FY15' %in% v) & ('FY14' %in% v) & ('FY13' %in% v)) {
testdf$Tally=='Asked Over The Past Three Years'
}
else if(('FY13' %in% v) & ('FY15' %in% v)) {
testdf$Tally=='Question Asked in FY13 & FY15 Only'
}
else { testdf$Tally=='Question Asked Once Only'
}
}
循环似乎运行时没有抛出错误消息,但它似乎没有创建新的 Tally
列。
对此的任何帮助将不胜感激。
最佳答案
在代码中,主要问题是在 if-else 子句中,您没有进行赋值(使用“<-”),而是使用“==”进行比较。这是我发现更优雅的解决方案,因为它不使用循环:
require(tidyverse)
testdf %>%
select(ID, FY) %>%
unique() %>%
mutate(is_true = 1) %>%
spread(key = FY, value = is_true, fill = 0) %>%
mutate(tally = case_when(
FY13 == 1 & FY14 == 1 & FY15 == 1 ~ 'Asked Over The Past Three Years',
FY14 == 1 & FY15 == 1 ~ 'Asked Over the Past Two Years',
FY13 == 1 & FY15 == 1 ~ 'Asked in FY12 & FY15 Only',
TRUE ~ 'Question Asked Once Only'
))
输出:
+------------------------------------------------------------+
| ID FY13 FY14 FY15 tally |
+------------------------------------------------------------+
| 1 AFRICAQ2 1 1 1 Asked Over The Past Three Years |
| 2 AFRICAQ5 0 1 1 Asked Over the Past Two Years |
| 3 AMERICAQ2 1 1 1 Asked Over The Past Three Years |
| 4 AMERICAQ5 1 1 1 Asked Over The Past Three Years |
| 5 ASIAQ2 1 1 1 Asked Over The Past Three Years |
| 6 ASIAQ5 1 0 1 Asked in FY12 & FY15 Only |
+------------------------------------------------------------+
关于R 循环数据帧列中的唯一值以根据条件创建另一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281109/