相关疑难解决方法(0)

如何在R中有效地实现合并

背景

几种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中有没有有效的方法?

r coalesce

37
推荐指数
6
解决办法
2万
查看次数

如何将数据框的两列与缺失数据合并?

这是先前问题的延伸。如何将数据框的两列组合为

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。

r missing-data

5
推荐指数
1
解决办法
9520
查看次数

在 R 中合并互补列

我正在清理一个大学项目的数据,我有两个变量,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 值?

r

5
推荐指数
1
解决办法
887
查看次数

R规范dplyr替换方式

假设您有:

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使此操作(非常常见的任务)更容易的功能?

r dplyr

3
推荐指数
1
解决办法
54
查看次数

标签 统计

r ×4

coalesce ×1

dplyr ×1

missing-data ×1