簡體   English   中英

跨多行的ifelse語句

[英]Ifelse statment across multiple rows

希望根據兩列的值添加列,但是多行。

示例數據集代碼:

A = c(1,1,1,2,2,2,3,3,3,4,4)
B = c(1,2,3,1,2,3,1,2,3,1,2)
C = c(0,0,0,1,0,0,1,1,1,0,1)
data <- data.frame(A,B,C)

數據集:

   A  B  C
1  1  1  0
2  1  2  0
3  1  3  0
4  2  1  1
5  2  2  0
6  2  3  0
7  3  1  1
8  3  2  1
9  3  3  1
10 4  1  0
11 4  2  1 

Ifelse聲明:

我想要實現的是“創建列D如果列C == 1,在列A == x,列D = 1的任何行中。列D == 0”

期望的輸出:

   A  B  C  D
1  1  1  0  0
2  1  2  0  0
3  1  3  0  0
4  2  1  1  1
5  2  2  0  1
6  2  3  0  1
7  3  1  1  1
8  3  2  1  1
9  3  3  1  1
10 4  1  0  1
11 4  2  1  1

我做了什么:

我今天已經考慮過了,但無法得出合乎邏輯的答案,我已經嘗試過查看長格式和寬格式的數據,但沒有想到就跳出來了。

注意:在實際應用中,x在C列中出現的次數不相等(某些在數據集中包含一個重復,其他包含20個)。

# just check using any() if any group has a single row with C==1 

library(dplyr)
data %>% group_by(A) %>% mutate(D = as.numeric(any(C==1)))

library(data.table)
data[, D:=as.numeric(any(C==1)), by = .(A)]   
#       A     B     C     D
#1      1     1     0     0
#2      1     2     0     0
#3      1     3     0     0
#4      2     1     1     1
#5      2     2     0     1
#6      2     3     0     1
#7      3     1     1     1
#8      3     2     1     1
#9      3     3     1     1
#10     4     1     0     1
#11     4     2     1     1

容易使用data.table

library(data.table)
data <- data.table(data)
x=2
data[,D:=ifelse(!A==x,ifelse(C==1,1,0),0)]
data

我們可以使用base R ave

data$D <- with(data, as.integer(ave(C==1, A, FUN=any)))
data
#   A B C D
#1  1 1 0 0
#2  1 2 0 0
#3  1 3 0 0
#4  2 1 1 1
#5  2 2 0 1
#6  2 3 0 1
#7  3 1 1 1
#8  3 2 1 1
#9  3 3 1 1
#10 4 1 0 1
#11 4 2 1 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM