R 循环数据帧列中的唯一值以根据条件创建另一个值

标签 r loops for-loop iteration

我的数据集包含多个财政年度(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)))

我首先通过连接 RegionQST 来创建 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/

相关文章:

r - 如何更改ggplot2中面板(灰色区域)的纵横比

Java For循环使用单个变量迭代100 64 36 16 4 0 4 16 36 64 100

c++ - 如何检查 a^b == c^d 是否。我面临的问题是循环的速度。我已经优化了寻找指数的部分

haskell - Haskell 中定义的 For 循环出现问题

windows - 了解 (set) 说明符的 CMD.EXE FOR 行为

java - Java 中的 ConnectFour 程序问题

r - 使用拟合的 2 次多项式模型根据 Y 值预测 X 值

r - 无法安装我创建的包

renv::status() 在 seq_len(length(splat) - 1) 中返回错误:

java - 如何在 Java 8 中循环遍历字节数组?