【问题标题】:R Pick First Value Given ConditionR选择给定条件的第一个值
【发布时间】:2020-02-15 20:34:29
【问题描述】:
data=data.frame("team"=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5),
                "score"=c(4,8,10,3,10,5,4,2,7,7,5,6,5,9,1),
                "trial"=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
                "sc3"=c(0,0,0,1,0,0,0,1,0,0,0,0,0,0,1),
                "sc7"=c(0,0,0,1,0,1,1,1,1,1,1,1,1,0,1),
                "sc9"=c(1,1,0,1,0,1,1,1,1,1,1,1,1,1,1),
                "sc3trial"=c(-99,-99,-99,1,1,1,2,2,2,-99,-99,-99,3,3,3),
                "sc7trial"=c(-99,-99,-99,1,1,1,1,1,1,1,1,1,1,1,1),
                "sc9trial"=c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))

我有“团队”、“分数”和“试验”列的数据。我想创建遵循这些规则的变量“sc3”、“sc7”、“sc9”、“sc3trial”、“sc7trial”、“sc9trial”::

“sc#”的规则很简单。请注意,这些是针对每个组的:

  1. 对于“sc3”:如果分数
  2. 对于“sc7”:如果分数
  3. 对于“sc9”:如果分数

“sc#trial”的规则也很简单。请注意,这些是针对每个组的:

  1. 对于“sc3trial”:如果任何“sc3” == 1,sc3trial 将记录第一次发生的试验。如果没有“sc3”等于“1”,则“sc3trial”等于“-99” 此逻辑同样适用于“sc7trial”和“sc9trial”

【问题讨论】:

  • 一个混乱,在标题中它说选择第一个值,但在你的描述中,它说if any "sc3" == 1。你能检查我的 dplyr 代码吗?这是预期的输出

标签: r dplyr reshape2


【解决方案1】:

对于前 3 列,下面的代码有效,但我不了解您对 sc3trial、sc7trial 和 sc9trial 的要求。

  data$sc3 = ifelse(data$score <= 3, 1, 0)
  data$sc7 = ifelse(data$score <= 7, 1, 0)
  data$sc7 = ifelse(data$score <= 9, 1, 0)

【讨论】:

  • 非常感谢——对于其他 3 个变量,我只想存储符合标准的每组分数的第一次出现。所需的输出显示在数据框“数据”中
  • 是的,我理解 sc7trial 和 sc9trial 的含义,但我不明白 sc3trial 的含义。
  • 所有的sc#trial变量都是同一个思路
  • 为什么第一个1后面有1,2,3和-99?
【解决方案2】:

我们可以使用map与score进行比较

library(dplyr)
library(purrr)
map(c(3, 7, 9), ~ +(data$score <= .x)) %>%
     set_names(c('sc3', 'sc7', 'sc9')) %>% 
     bind_cols(data %>% select(-c(sc3, sc7, sc9)), .)

如果我们只有 3 个变量,那么

data %>% 
   mutate(sc3 = + (score <=3), sc7 = +(score <=7), sc9 = +(score <= 9)) %>%
   group_by(team) %>%
   mutate(sc3trial = c(-99, 1)[(any(sc3 == 1)) + 1],
           sc7trial = c(-99, 1)[(any(sc7 == 1)) + 1]
          sc9trial = c(-99, 1)[(any(sc9 == 1)) + 1])

或在base R

nm1 <- c('sc3', 'sc7', 'sc9')
data[nm1] <- +(data[nm1] <= c(3, 7, 9)[col(data[nm1])])

【讨论】:

  • 非常感谢——我想知道有没有严格的 dplyr 方法?
  • @bvowe 我们不能用purrr
  • 是的,当然我只是想知道,因为我以前从未使用过它,所以想知道“dplyr”解决方案是否可行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
相关资源
最近更新 更多