[英]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))
這是使用dplyr
和rbind
另一種方法
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.