如何删除 R 中的 na 并使低于值上升

How do I remove na in R and make below value to go up

我有如下数据框:

如何删除 na 并使用以下值来增加?

谢谢

  id name.america name.europe name.asia
   1            a        <NA>      <NA>
   2         <NA>           b      <NA>
   3         <NA>        <NA>         c
   4            d        <NA>      <NA>

更改为:

  id name.america name.europe name.asia
   1            a           b         c 
   2            d           

我们可以遍历列并删除 NA,然后通过在获取 NA 后追加 NA 使 list 元素的 lengths 相同max list 元素的长度。基于此,子集数据集的 'id' 列并附加输出

lst <- lapply(df1[-1], na.omit)
lst1 <- lapply(lst, `length<-`, max(lengths(lst)))
out <- data.frame(lst1)
out1 <- cbind(id = df1$id[seq_len(nrow(out))], out)
out1
#  id name.america name.europe name.asia
#1  1            a           b         c
#2  2            d        <NA>      <NA>

如果我们需要将 NA 更改为空白 ("") - 不推荐

out1[is.na(out1)] <- ""

数据

df1 <- structure(list(id = 1:4, name.america = c("a", NA, NA, "d"), 
name.europe = c(NA, "b", NA, NA), name.asia = c(NA, NA, "c", 
NA)), class = "data.frame", row.names = c(NA, -4L))
df1[, -1] <- lapply(df1[,-1], function(x) c(na.omit(x), rep("",length(x)-length(na.omit(x)))))
df1[1:max(colSums(!(df1[,-1]==""))),]

#  id name.america name.europe name.asia
#1  1            a           b         c
#2  2            d                      

tidyverse基于解决方案

require(tidyverse)

df1 %>% 
    gather(key = "name", value = "val", -id) %>% 
    na.omit() %>% 
    select(-id) %>%
    group_by(name) %>% 
    mutate(id = 1:n()) %>% 
    spread(key = name, value = val)

结果

# A tibble: 2 x 4
     id name.america name.asia name.europe
  <int> <chr>        <chr>     <chr>      
1     1 a            c         b          
2     2 d            NA        NA  

备注

  • 如果需要,您可以在转换之前使用 select 或该变量重新排序列。
  • NAs 保留原样。如果需要,您可以使用 tidyr::replace_na 插入一些字符串或 space。我不鼓励你那样做。

数据

取自上文@akrun's

df1 <- structure(
    list(
        id = 1:4,
        name.america = c("a", NA, NA, "d"),
        name.europe = c(NA, "b", NA, NA),
        name.asia = c(NA, NA, "c",
                      NA)
    ),
    class = "data.frame",
    row.names = c(NA, -4L)
)