簡體   English   中英

R Data.Table 多重賦值 IfElse

[英]R Data.Table Multiple Assignment IfElse

data1=data.frame(Year=c(1,1,1,2,2,2,3,3,3),
"Group=c('A','A','A','B','B','B','C','C','C'),
"A=c(5,6,7,10,9,6,10,7,10),
"B=c(8,10,5,6,9,8,9,5,8),
"C=c(7,9,5,5,8,7,9,5,10))



data2=data.frame(Year=c(1,1,1,2,2,2,3,3,3),
"Group=c('A','A','A','B','B','B','C','C','C'),
"A=c(5,6,7,10,9,6,0,0,0),
"B=c(8,10,5,6,9,8,0,0,0),
"C=c(7,9,5,5,8,7,-99,-99,-99))

我有'data1'並希望通過使用data.table中的fifelse來獲得'data2'。 規則是,如果 Group = 'C',則列 'A' 和 'B' 等於 0,列 'C' 等於 -99。

data.table使用條件替換,

data.table::setDT(data1)
data1[Group == "C",`:=`(A = 0, B = 0, C = -99)]

請注意,最終的數據幀是data1:=通過引用更新),而不是data2

這是data.table一種選擇

library(data.table)
setDT(data1)[Group == 'C', names(data1)[3:5] := .(0, 0, -99)]
data1
#   Year Group  A  B   C
#1:    1     A  5  8   7
#2:    1     A  6 10   9
#3:    1     A  7  5   5
#4:    2     B 10  6   5
#5:    2     B  9  9   8
#6:    2     B  6  8   7
#7:    3     C  0  0 -99
#8:    3     C  0  0 -99
#9:    3     C  0  0 -99

或者set另一個選項

v1 <- c(0, 0, -99)
nm1 <- c('A', 'B', 'C')
for(j in seq_along(nm1)) set(data1, i = which(data1$Group == 'C'), j= nm1[j], value = v1[j])

base R ,我們可以做

data1[data1$Group == 'C',  c('A', 'B', 'C')] <- list(0, 0, -99)

數據

data1 <- structure(list(Year = c(1, 1, 1, 2, 2, 2, 3, 3, 3), Group = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
    A = c(5, 6, 7, 10, 9, 6, 10, 7, 10), B = c(8, 10, 5, 6, 9, 
    8, 9, 5, 8), C = c(7, 9, 5, 5, 8, 7, 9, 5, 10)), 
    class = "data.frame", row.names = c(NA, 
-9L))

這是使用dplyrrbind另一種方法

library(dplyr)
rbind(data1 %>% filter(Group != "C"),data1 %>% filter(Group == "C") %>% mutate(A=0, B=0,C=-99))

輸出

Year Group  A  B   C
1    1     A  5  8   7
2    1     A  6 10   9
3    1     A  7  5   5
4    2     B 10  6   5
5    2     B  9  9   8
6    2     B  6  8   7
7    3     C  0  0 -99
8    3     C  0  0 -99
9    3     C  0  0 -99

暫無
暫無

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

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