首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并数据帧中的行,其中的行是不相交的并且包含NAs

问合并数据帧中的行,其中的行是不相交的并且包含NAs
EN

Stack Overflow用户
提问于 2013-01-11 06:58:06
回答 2查看 20.6K关注 0票数 14

我有一个数据帧,它有两行:

代码语言:javascript
复制
| code | name  | v1 | v2 | v3 | v4 |
|------|-------|----|----|----|----|
| 345  | Yemen | NA | 2  | 3  | NA |
| 346  | Yemen | 4  | NA | NA | 5  |

有没有简单的方法来合并这两行?如果我将"346“中的"345”重命名,会不会让事情变得更简单?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 01:44:03

您可以使用aggregate。假设您想要合并列name中具有相同值的行

代码语言:javascript
复制
aggregate(x=DF[c("v1","v2","v3","v4")], by=list(name=DF$name), min, na.rm = TRUE)
   name v1 v2 v3 v4
1 Yemen  4  2  3  5

这就像SQL SELECT name, min(v1) GROUP BY name。min函数是任意的,您也可以使用max或mean,所有这些函数都返回来自安娜的非NA值,如果是na.rm = TRUE,则返回非NA值。(如果R中有一个类似SQL的coalesce()函数,听起来会更好。)

但是,您应该首先检查给定name的所有非NA值是否都相同。例如,使用min和max运行aggregate并进行比较,或者使用range运行它。

最后,如果您有比v1-4多得多的变量,那么可以使用DF[,!(names(DF) %in% c("code","name"))]来定义列。

票数 11
EN

Stack Overflow用户

发布于 2018-09-27 02:45:31

添加dplyr和data.table解决方案以确保完整性

使用 dplyr::coalesce()的

代码语言:javascript
复制
library(dplyr)

sum_NA <- function(x) {if (all(is.na(x))) x[NA_integer_] else sum(x, na.rm = TRUE)}

df %>% 
  group_by(name) %>% 
  summarise_all(sum_NA)
#> # A tibble: 1 x 6
#>   name   code    v1    v2    v3    v4
#>   <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Yemen   691     4     2     3     5

# Ref: https://stackoverflow.com/a/45515491
# Supply lists by splicing them into dots:
coalesce_by_column <- function(df) {
  return(dplyr::coalesce(!!! as.list(df)))
}

df %>% 
  group_by(name) %>% 
  summarise_all(coalesce_by_column)
#> # A tibble: 1 x 6
#>   name   code    v1    v2    v3    v4
#>   <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Yemen   345     4     2     3     5

使用 data.table的

代码语言:javascript
复制
# Ref: https://stackoverflow.com/q/28036294/
library(data.table)
setDT(df)[, lapply(.SD, na.omit), by = name]
#>     name code v1 v2 v3 v4
#> 1: Yemen  345  4  2  3  5
#> 2: Yemen  346  4  2  3  5

setDT(df)[, code := NULL][, lapply(.SD, na.omit), by = name]    
#>     name v1 v2 v3 v4
#> 1: Yemen  4  2  3  5

setDT(df)[, code := NULL][, lapply(.SD, sum_NA), by = name]
#>     name v1 v2 v3 v4
#> 1: Yemen  4  2  3  5
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14268814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档