繁体   English   中英

R Cols 的第一个非 NA 值

[英]R First Non-NA Value From Cols

df <- data.frame(ID=c(1,2,3,4,5,6),
                CO=c(-6,4,2,3,0,2),
                CATFOX=c(1,NA,NA,3,0,NA),
                DOGFOX=c(NA,NA,5,1,2,NA),
                RABFOX=c(NA,3,NA,5,3,NA),
                D=c(0,4,5,6,1,2),
                WANT=c(1,3,5,3,0,NA))

我有一个 dataframe 并且我希望列WANT采用不是 NA 的“CATFOX”“DOGFOX”“RABFOX”的第一个值。 有没有data.table解决方案? 我试过了,但没有产生预期的结果:

df$WANT=do.call(coalesce, data[grepl('FOX',names(data))])

您的示例中有coalesce ,即dplyr的构造。 尝试fcoalesce

library(data.table)

setDT(df)[, WANT2 := fcoalesce(CATFOX, DOGFOX, RABFOX)]

Output:

   ID CO CATFOX DOGFOX RABFOX D WANT WANT2
1:  1 -6      1     NA     NA 0    1     1
2:  2  4     NA     NA      3 4    3     3
3:  3  2     NA      5     NA 5    5     5
4:  4  3      3      1      5 6    3     3
5:  5  0      0      2      3 1    0     0
6:  6  2     NA     NA     NA 2   NA    NA

你可以试试这个base R解决方案:

#Data
data=data.frame(ID=c(1,2,3,4,5),
                CO=c(-6,4,2,3,0),
                CATFOX=c(1,NA,NA,3,0),
                DOGFOX=c(NA,NA,5,1,2),
                RABFOX=c(NA,3,NA,5,3),
                D=c(0,4,5,6,1),
                WANT=c(1,3,5,3,0))
#Process
index <- which(names(data) %in% c('CATFOX','DOGFOX','RABFOX'))
data$WANT2 <- apply(data[,index],1,function(x) x[min(which(!is.na(x)))])

Output:

  ID CO CATFOX DOGFOX RABFOX D WANT WANT2
1  1 -6      1     NA     NA 0    1     1
2  2  4     NA     NA      3 4    3     3
3  3  2     NA      5     NA 5    5     5
4  4  3      3      1      5 6    3     3
5  5  0      0      2      3 1    0     0

我们可以在base R中使用矢量化选项

i1 <- endsWith(names(df), 'FOX')
df$WANT2 <-  df[i1][cbind(seq_len(nrow(df)), max.col(!is.na(df[i1]), 'first'))]
df$WAN2
#[1]  1  3  5  3  0 NA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM