【问题标题】:select observations based on multiple conditions根据多个条件选择观察值
【发布时间】:2016-11-16 01:52:54
【问题描述】:

对于每个主题,根据以下内容保留一个观察值(或行):

如果var2=c and var3=B 然后保持观察。 如果没有,请检查if var2=c and var3=S 并保持观察。 如果不是,那么检查是否var2=L and var3=B, 最后,检查是否var2=L and var3=S,如果不放0。

任何帮助将不胜感激。

我的数据如下所示:

id   var1   var2    var3
1   100 L   S
1   100 L   B
1   2   C   B
1   2   C   S
2   5   C   S
2   10  L   S
2   NA  L   B
2   NA  C   B

我想要的结果是:

id   var1   var2    var3
1   2   C   B
2   5   C   S

【问题讨论】:

  • 我不明白...你能更好地解释一下条件吗?
  • 第一个代码块——显示赋值的地方——没有意义。例如“var2=c and var3=B if not then”。你是什​​么意思“如果不是那么”?这里正在测试什么?你的意思是“if(var3=="B") {var2 <- "c"}”,如果不是真的那么你的下一个陈述,等等?
  • 尝试阅读这个答案:stackoverflow.com/questions/4935479/…
  • 但对于id =2,您还有CB。为什么要取CS

标签: r conditional-statements multiple-conditions


【解决方案1】:

这是一个使用dplyr的想法,

library(dplyr)
x <- c('CB', 'CS', 'LB', 'LS') #vector with conditions
df %>% 
  group_by(id) %>% 
  na.omit() %>% 
  slice(order(match(paste0(var2, var3), x))[1])

#Source: local data frame [2 x 4]
#Groups: id [2]

#     id  var1   var2   var3
#  <int> <int> <fctr> <fctr>
#1     1     2      C      B
#2     2     5      C      S

数据

dput(df)
structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), var1 = c(100L, 
100L, 2L, 2L, 5L, 10L, NA, NA), var2 = structure(c(2L, 2L, 1L, 
1L, 1L, 2L, 2L, 1L), .Label = c("C", "L"), class = "factor"), 
    var3 = structure(c(2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L), .Label = c("B", 
    "S"), class = "factor")), .Names = c("id", "var1", "var2", 
"var3"), class = "data.frame", row.names = c(NA, -8L))

【讨论】:

  • 谢谢。你的意思是条件CB必须结合??
  • @sri 不一定要合并,但是比较容易和match基于'重要性'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2022-01-09
  • 2019-11-20
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多