2017-07-19 42 views
1

我无法找到这个问题的确切答案,所以我希望我不会重复一个问题。按行组合行与不同的NA在每行

我有一个数据帧如下

groupid col1 col2 col3 col4 
    1  0  n  NA  2  
    1  NA NA 2  2 

我试图与这传达的是存在其中总信息跨两行传播重复的ID,我想这些行结合起来,得到所有的信息合并成一行。我如何去做这件事?

我试图玩group_by并粘贴,但最终使数据变得混乱(例如col4中获得22而不是2)和sum()不起作用,因为一些列是字符串,而那些是不是分类变量,将它们相加会改变信息。

有什么我可以做的事情来折叠行,并保持一致的数据不变,同时填补审计署?

编辑:

对不起所需的输出如下:

groupid col1 col2 col3 col4 
    1  0  n  2  2 
+0

对您有帮助吗? https://stackoverflow.com/a/42567254/496803甚至这一个 - https://stackoverflow.com/questions/33601267/merging-similar-rows-in-a-data-frame/33601491 – thelatemail

+0

检查我的答案和我提供的链接 – Wen

+0

哦,第二个链接可能工作,我会试一试 – MokeEire

回答

6

这是你想要的吗? zoo + dplyr也检查这里

df %>% 
    group_by(groupid) %>% 
    mutate_all(funs(na.locf(., na.rm = FALSE, fromLast = FALSE)))%>%filter(row_number()==n()) 


# A tibble: 1 x 5 
# Groups: groupid [1] 
    groupid col1 col2 col3 col4 
    <int> <int> <chr> <int> <int> 
1  1  0  n  2  2 

EDIT1

没有过滤器的link,会给整个回数据帧。

df %>% 
     group_by(groupid) %>% 
     mutate_all(funs(na.locf(., na.rm = FALSE, fromLast = FALSE))) 

# A tibble: 2 x 5 
# Groups: groupid [1] 
    groupid col1 col2 col3 col4 
    <int> <int> <chr> <int> <int> 
1  1  0  n NA  2 
2  1  0  n  2  2 

filter这里,只是片最后一个,na.locf将进行先前未NA值,这意味着你的小组最后一排是你想要的。

也建议使用@ thelatemail。你可以做到以下几点,给出相同的答案。

df %>% group_by(groupid) %>% summarise_all(funs(.[!is.na(.)][1])) 

EDIT2

假设你有冲突,你要告诉他们所有。

df <- read.table(text="groupid col1 col2 col3 col4 
    1  0  n  NA  2  
       1  1 NA 2  2", 
       header=TRUE,stringsAsFactors=FALSE) 
df 
    groupid col1 col2 col3 col4 
1  1 0 n NA 2 
2  1 1(#)<NA> 2 2(#) 
df %>% 
    group_by(groupid) %>% 
    summarise_all(funs(toString(unique(na.omit(.)))))#unique for duplicated like col4 
    groupid col1 col2 col3 col4 
    <int> <chr> <chr> <chr> <chr> 
1  1 0, 1  n  2 2 
+0

该输出正是我想要的,我将不得不查找na.locf()。你能解释一下这个过滤命令在做什么吗? – MokeEire

+0

@MokeEire看到我的编辑 – Wen

+0

@thelatemail感谢您的解决方案〜了解了很多 – Wen

0

你能够得出在这种情况下所需的输出?将data.frame转换为as.vector(),as.matrix()和分组/分解可能会有所帮助。

更新: 为每列找到唯一元素并省略NAs。

df<-data.frame(groupid=c(1,1), col1=c(0,NA), col2=c('n', NA), col3=c(NA,2), col4=c(2,2)) # your input 
out<-data.frame(df[1,]) # where the output is stored, duplicate retaining 1 row 
for(i in 1:ncol(df)) out[,i]<-na.omit(unique(df[,i])) 
print(out) 
+0

这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/16766375) – loki

+0

我没有权限昨天发表评论。这和我所能做的一样多。有必要澄清这个问题,我所做的一切都是道德上合理的。 –

+0

然后,你现在就做,并删除这个答案。 – loki