当前位置: 首页 > 知识库问答 >
问题:

带dplyr的条件和/或嵌套ifelse变异逻辑

凤高澹
2023-03-14

我有一个数据集是这样排列的:

ID   A   B  C   D   Win  Loss
001  NA  3  NA  NA  6    NA  
002  NA  NA NA  NA  NA   17
003  1   5  12  18  NA   22
004  NA  7  9   NA  31   NA
005  8   2  NA  NA  NA   14
006  2   6  12  19  25   NA
007  NA  NA NA  NA  6    NA 

在这个数据集中,ID应该按时间顺序通过每个阶段(A、B、C、D),并在最后达到赢/输(ID 003和006)

但是,有时 ID 向后移动 (ID 005),其他 ID 跳过阶段(ID 001 和 004),而有些则直接转到赢/输(ID 002 和 007)。

我想用dplyr mutate逻辑调用这些。输出:

ID   A   B  C   D   Win  Loss  Backwards Skip  Just W/L
001  NA  3  NA  NA  6    NA    F         T     F
002  NA  NA NA  NA  NA   17    F         T     T
003  1   5  12  18  NA   22    F         F     F
004  NA  7  9   NA  31   NA    F         T     F
005  8   2  NA  NA  NA   14    T         T     F
006  2   6  12  19  25   NA    F         F     F
007  NA  NA NA  NA  6    NA    F         T     T

我知道我应该用类似这样的逻辑,但是我我就是想不通。

提前感谢。

编辑:

奖励积分,如果你也可以告诉我如何计算每个阶段之间经过的时间/天,即使它跳过了几个。

共有1个答案

顾炎彬
2023-03-14

这可以使用基本R来完成。选择感兴趣的列df[LETTERS[1:4]],创建存在/不存在“NA”的逻辑矩阵(is.na(df[...))。]否定它(),以便非NA元素变为“TRUE”,获取行和行和行并否定它因此具有0非NA值的行将变为TRUE,而只有赢或输的情况就是这样。对于“向后”,我们可以对行使用循环方法(apply()(MARGIN=1),检查非NA元素(diff(na.omit(x)))的差值是否有任何负数(any(....)

JustWL <- !rowSums(!is.na(df[LETTERS[1:4]]))
Backwards <- apply(df[LETTERS[1:4]], 1, function(x) any(diff(na.omit(x))<0))
Skip <- !!rowSums(is.na(df[LETTERS[1:4]]))

df1 <- data.frame(df, JustWL, Backwards, Skip)
df1
#   ID  A  B  C  D Win Loss JustWL Backwards  Skip
# 1  1 NA  3 NA NA   6   NA  FALSE     FALSE  TRUE
# 2  2 NA NA NA NA  NA   17   TRUE     FALSE  TRUE 
# 3  3  1  5 12 18  NA   22  FALSE     FALSE FALSE
# 4  4 NA  7  9 NA  31   NA  FALSE     FALSE  TRUE
# 5  5  8  2 NA NA  NA   14  FALSE      TRUE  TRUE
# 6  6  2  6 12 19  25   NA  FALSE     FALSE FALSE
# 7  7 NA NA NA NA   6   NA   TRUE     FALSE  TRUE

或者在< code>dplyr中使用相同的代码

library(dplyr)
 df %>% 
    mutate(JustWL=!rowSums(!is.na(.[LETTERS[1:4]])), 
           Skip=!!rowSums(is.na(.[LETTERS[1:4]]))) %>%
           rowwise() %>% 
           do(data.frame(., Backwards= 
               any(diff(na.omit(unlist(.[LETTERS[1:4]])))<0)))
 类似资料:
  • 考虑以下数据框架: 这就产生了: 我希望按类分组,如果每个组包含两个成员,然后从中减去1,如果,否则,从中减去该组中最小值...如果每个组不包含两个成员,那么我们从中减去零。 使用包执行上述操作的代码可以使用以下表达式表示: 但是,这会产生不正确的结果,其中第二个始终解析为第一个条件: 如果没有第一条语句,则可以生成正确的结果。 生产: 通过检查成功完成类似工作的其他代码片段,我们可以看到这个问题

  • 我有一个名称重复的数据集。如果名称重复,我想创建一个值为1(TRUE)或0(FALSE)的新列。 这是我使用的代码: 或者 然而,我得到了上面可以看到的错误。 另一个想法是使用group_by,然后计算计数。喜欢: 但是,它不能返回原始数据帧后group_by

  • 我用R编写了以下代码,效果很好。但是,假设我必须对具有多个级别的因子变量应用类似的代码(

  • 在一个有四列的大数据框(“myfile”)中,我必须添加第五列,其中的值有条件地基于前四列。 更喜欢使用和的答案,主要是因为它在大型数据集中的速度。 我的数据框如下所示: 第五列(V5)的值基于一些条件规则: 现在我想使用函数在所有行上使用这些规则(以避免慢循环)。类似这样的事情(是的,我知道这样不行!): 结果应该是: 如何在dplyr中执行此操作?

  • 我有一个带有两个得分列的data.frame。我希望在每行的基础上有条件地使用其中一个的数据。我用下面的一个例子来解释... 在这种情况下,Final最终将与test_low相同,因为对于两个Mains(即,当单元格为'high'时,单元格为'low时),test_low列小于test_high列。

  • 我正在努力编写一个具有多个和/或条件的弹性搜索查询。 它的基本逻辑如下: 正如docs中提到的,如果一个文档只满足must子句,那么它就被认为是匹配的。在这种情况下,should子句起到增强作用,即如果文档除了mouth子句之外还匹配一个或多个should子句,那么它将具有更高的相关性得分,假设cond2、cond3和cond4是计算相关性得分的查询。 问题是我只想要至少匹配OR条件之一的文档。