如何合并一个包含NA的数据框中的列以去除NA?

4

我有一个包含多个列的数据框 all_data,如下所示

VoS            Value            Total.Value
1              NA               NA
NA             NA               41
NA             13               NA
76             NA               NA
4              NA               NA
NA             7                NA
NA             NA               22

我希望将这些列合并成一个名为Total VoS的列,如下所示:
Total VoS
1
41
13
76
4
7
22

我已经尝试过。

all_data <- unite( all_data, Total VoS, VoS, 
                                        Value, 
                                        Total.Value )

这个很接近我想要的,但最终变成了这样:
Total VoS
1_NA_NA
41_NA_NA
13_NA_NA
76_NA_NA
4_NA_NA
7_NA_NA
22_NA_NA

我尝试在 unite 函数中使用 na.rm = TRUE,但是会返回错误信息:Error: `TRUE` 必须评估为列位置或名称,而不是逻辑向量

3个回答

4

使用 unite 函数时,默认情况下有一个名为 na.rm 的参数,其值为 FALSE

library(tidyr)
unite( all_data, Total, VoS,  Value, Total.Value, na.rm = TRUE )
#  Total
#1     1
#2    41
#3    13
#4    76
#5     4
#6     7
#7    22

在原始数据中,将感兴趣的列从 factor 转换为 character,然后执行 unite
library(dplyr)
all_data_new %>%
     mutate_at(c(3, 6, 7, 11), as.character) %>% 
     unite(New, names(.)[c(3, 6, 7, 11)], na.rm = TRUE)
#  Geographic.area.name Year         New X2007.NAICS.codes.and.NAICS.based.rollup.code
#1              Alabama 2009  90,530,746                                         31-33
#2              Alabama 2008 116,401,285                                         31-33
#3              Alabama 2009   9,932,542                                           311
#4              Alabama 2008   9,661,432                                           311
#5              Alabama 2009   1,819,728                                          3111
#6              Alabama 2008   1,744,928                                          3111
#  Meaning.of.2007.NAICS.codes.and.NAICS.based.rollup.code
#1                                           Manufacturing
#2                                           Manufacturing
#3                                      Food manufacturing
#4                                      Food manufacturing
#5                               Animal food manufacturing
#6                               Animal food manufacturing
  #Relative.standard.error.for.estimate.of.total.value.of.shipments.and.receipts.for.services.... X2012.NAICS.code
#1                                                                                           <NA>             <NA>
#2                                                                                           <NA>             <NA>
#3                                                                                           <NA>             <NA>
#4                                                                                           <NA>             <NA>
#5                                                                                           <NA>             <NA>
#6                                                                                           <NA>             <NA>
#  Meaning.of.2012.NAICS.code
#1                       <NA>
#2                       <NA>
#3                       <NA>
#4                       <NA>
#5                       <NA>
#6                       <NA>

或者另一个选项是 coalesce

library(dplyr)
all_data %>%
    transmute(Total = coalesce(!!! .))
#  Total
#1     1
#2    41
#3    13
#4    76
#5     4
#6     7
#7    22

或者在 base R 中使用pmax函数。

do.call(pmax, c(all_data, na.rm = TRUE))

或者使用pmin

do.call(pmin, c(all_data, na.rm = TRUE))

数据

all_data <- structure(list(VoS = c(1L, NA, NA, 76L, 4L, NA, NA), Value = c(NA, 
NA, 13L, NA, NA, 7L, NA), Total.Value = c(NA, 41L, NA, NA, NA, 
NA, 22L)), class = "data.frame", row.names = c(NA, -7L))

all_data_new <- structure(list(Geographic.area.name = structure(c(1L, 1L, 1L,
1L, 1L, 1L), .Label = "Alabama", class = "factor"), Year = c(2009L,
2008L, 2009L, 2008L, 2009L, 2008L), Total.value.of.shipments...1.000. = c("90,530,746",
"116,401,285", "9,932,542", "9,661,432", "1,819,728", "1,744,928"
), X2007.NAICS.codes.and.NAICS.based.rollup.code = structure(c(1L,
1L, 2L, 2L, 3L, 3L), .Label = c("31-33", "311", "3111"), class = "factor"),
Meaning.of.2007.NAICS.codes.and.NAICS.based.rollup.code = structure(c(3L,
3L, 2L, 2L, 1L, 1L), .Label = c("Animal food manufacturing",
"Food manufacturing", "Manufacturing"), class = "factor"),
X.Total.value.of.shipments...1.000.. = structure(c(NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
), .Label = character(0), class = "factor"), X.Total.value.of.shipments.and.receipts.for.services...1.000.. = structure(c(NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
), .Label = character(0), class = "factor"), Relative.standard.error.for.estimate.of.total.value.of.shipments.and.receipts.for.services.... = c(NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_), X2012.NAICS.code = structure(c(NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
), .Label = character(0), class = "factor"), Meaning.of.2012.NAICS.code = structure(c(NA_integer_,
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
), .Label = character(0), class = "factor"), Total.value.of.shipments.and.receipts.for.services...1.000. = c(NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_)), row.names = c(NA, 6L), class = "data.frame")

@MarideeWeber 抱歉,出现了一个错别字,少了一个 , - akrun
没关系,coalesce也不起作用,因为我的列是因子而不是字符,值得转换吗? - Maridee Weber
我将所有内容转换为字符,但仍然出现相同的错误:“TRUE必须评估为列位置或名称,而不是逻辑向量”。 - Maridee Weber
@MarideeWeber,您能否使用dput将您的数据更新到帖子中,以便我可以正确获取结构。谢谢。 - akrun
1
@akrun,我真的很喜欢那两个pmax/pmin的解决方案。 - Martin Gal
显示剩余3条评论

2

使用zoo的另一个可能性:

library(zoo)

all_data %>% 
  pmap_dfr(~ na.locf(c(...))) %>%
  select(Total.Value)

这可以提供
# A tibble: 7 x 1
  Total.Value
        <dbl>
1           1
2          41
3          13
4          76
5           4
6           7
7          22

1
您可以使用na.omit
res <- data.frame(total.vos=apply(dat[c("VoS", "Value", "Total.Value")], 1, na.omit))
res
#   total.vos
# 1         1
# 2        41
# 3        13
# 4        76
# 5         4
# 6         7
# 7        22

如果您的数据框只有这三列,那么简化为:
res <- data.frame(total.vos=apply(dat, 1, na.omit))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接