几种SQL语言(我主要使用postgreSQL)有一个名为coalesce的函数,它返回每行的第一个非空列元素.当表中包含大量NULL元素时,这可以非常有效地使用.
我在R中的许多场景中都遇到过这种情况,当处理不太结构化的数据时,其中包含很多NA.
我自己做了一个天真的实现,但它的速度非常慢.
coalesce <- function(...) {
apply(cbind(...), 1, function(x) {
x[which(!is.na(x))[1]]
})
}
Run Code Online (Sandbox Code Playgroud)
a <- c(1, 2, NA, 4, NA)
b <- c(NA, NA, NA, 5, 6)
c <- c(7, 8, NA, 9, 10)
coalesce(a,b,c)
# [1] 1 2 NA 4 6
Run Code Online (Sandbox Code Playgroud)
coalesce在R中有没有有效的方法?
这是先前问题的延伸。如何将数据框的两列组合为
data <- data.frame('a' = c('A','B','C','D','E'),
'x' = c("t",2,NA,NA,NA),
'y' = c(NA,NA,NA,4,"r"))
Run Code Online (Sandbox Code Playgroud)
显示为
'a' 'x' 'y'
A t NA
B 2 NA
C NA NA
D NA 4
E NA r
Run Code Online (Sandbox Code Playgroud)
要得到
'a' 'mycol'
A t
B 2
C NA
D 4
E r
Run Code Online (Sandbox Code Playgroud)
我试过这个
cbind(data[1], mycol = na.omit(unlist(data[-1])))
Run Code Online (Sandbox Code Playgroud)
但它显然没有保留行NA。
我正在清理一个大学项目的数据,我有两个变量,DidVote 和 WouldVote,指示该人投票给谁(如果他们在实际选举中投票)以及他们会投票给谁(如果他们投票)不参与选举投票)。这两列显然是互补的,这意味着如果 DidVote 有一些价值,WouldVote 就是 NA,反之亦然。我想将这两个变量合并为一个,这意味着我想要得到类似第三列的内容:
DidVote WouldVote Vote
x NA x
NA z z
NA y y
y NA y
Run Code Online (Sandbox Code Playgroud)
我尝试执行以下操作:
data$Vote <- paste(data$DidVote,data$WouldVote)
Run Code Online (Sandbox Code Playgroud)
但我最终得到的是:
DidVote WouldVote Vote
x NA x NA
NA z NA z
NA y NA y
y NA y NA
Run Code Online (Sandbox Code Playgroud)
如何合并这两列,以便新变量从两个变量 DidVote 和 WouldVote 中获取非 NA 值?
假设您有:
df = data.frame(a = c(1,2,NA),b = c(NA, 1,2))
> df
a b
1 1 NA
2 2 1
3 NA 2
Run Code Online (Sandbox Code Playgroud)
并希望基于a创建一个新列c。如果缺少a,则使用b。这有效:
df %>% mutate(c= a,
c = replace(c, is.na(a), b[is.na(a)]))
Run Code Online (Sandbox Code Playgroud)
但是(对我来说,只有我吗?)看起来笨拙(就我而言,我必须拼出is.na(a)两次)。这比较容易:
df %>%
rowwise() %>%
mutate(c = a,
c = replace(c, is.na(a), b]))
Run Code Online (Sandbox Code Playgroud)
但是它需要额外的rowwise()命令,我可以想象到情景陈述中我的陈述之和mutate将无法按行工作。
我是否缺少一些dplyr使此操作(非常常见的任务)更容易的功能?