如何去除R中的na并使下面的值上升

如何去除R中的na并使下面的值上升,r,reshape,R,Reshape,我有一个如下所示的数据框: 我如何删除na并使用下面的值向上 谢谢 id name.america name.europe name.asia 1 a <NA> <NA> 2 <NA> b <NA> 3 <NA> <NA> c 4 d

我有一个如下所示的数据框:

我如何删除na并使用下面的值向上

谢谢

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

我们可以循环遍历列并删除
NA
,然后在获得
list
元素的
max
长度后,通过在末尾添加
NA
使
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>
数据 基于df1[,-1]的解决方案

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)
结果
您的数据是如何以这种格式结束的?为id=2取一个值,然后将其移动到id=1,感觉很奇怪。Id应该是您的标识符
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                      
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  
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)
)