2017-10-20 41 views
1

我有一个看起来像这样的程序的输出。R:如何附加数据帧的不同头部和/或数据帧的溢出部分

Keg  X A D E F 
123F 0 1 0 0 0 
134E 0 0 0 0 1 
234B 0 0 0 0 0 
Keg  G 
123F 0 
134E 0 
234B 1 
Keg  X C D E F 
ABCD 0 1 0 0 0 
13CD 0 0 0 0 1 
234F 0 0 0 1 0 
DCEF 0 0 1 0 0 

我试图安排这样

Keg  A C D E F G 
123F 1 0 0 0 0 0 
134E 0 0 0 0 1 0 
234B 0 0 0 0 0 1 
ABCD 0 1 0 0 0 0 
13CD 0 0 0 0 1 0 
234F 0 0 0 1 0 0 
DCEF 0 0 1 0 0 0 

此段文字假设两个连续keg`s之间的文本作为一个块。

在这个例子中,前两个块具有相同的桶值。实际上,文本溢出,导致第二个块具有相同的桶值。每个新的块(不是溢出块)都有一个列X.

列X需要在输出结果证明的最后去掉。列数是有限的,可以假定为(A,C,D,E,F,G)。

输出中可以有任意数量的块。任何溢出的块将在其家族之下。数据块总是有列名称,这些名称是有限名称集的一部分。列名不重复。

我们也可以有不同的列名顺序的数据块。

我知道我可以使用bind_row()函数合并两个不同列名的块,我知道我可以使用inner_join(),溢出的块。我无法巧妙地整合这两个概念。我为这样的文本编写了R代码,没有溢出部分。

希望有人能告诉我如何做到这一点。我是R新手,正在为此而苦苦挣扎。

回答

3

我们split数据集中的“data.frame是基于在大写字母的发生‘X一list’,通过环路list(”地图“),与那些第一行字母更改列名,然后我们做与bind_rows单一数据集,通过“凯格”分组,得到其他列

library(tidyverse) 
nm1 <- c("A", "C", "D", "E", "F", "G") 
split(df1, cumsum(grepl("[A-Z]", df1$X))) %>% 
     map(~ if(any(grepl("[A-Z]", .$X))) { 
       names(.) <- unlist(.[1,]) 
       .[-1,] 
     } else .) %>% 
      map(~ .[names(.) != ""]) %>% 
      bind_rows %>% 
      group_by(Keg) %>% 
      summarise_at(vars(nm1), funs(sum(as.numeric(.), na.rm = TRUE))) 

# A tibble: 7 x 7 
# Keg  A  C  D  E  F  G 
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#1 123F  1  0  0  0  0  0 
#2 134E  0  0  0  0  1  0 
#3 13CD  0  0  0  0  1  0 
#4 234B  0  0  0  0  0  1 
#5 234F  0  0  0  1  0  0 
#6 ABCD  0  1  0  0  0  0 
#7 DCEF  0  0  1  0  0  0 
+1

我不能给予好评的答案,由于名声小于15 – Acinonyx

+0

有一个Q代表你的sum。上面的解决方案假设nm1矢量中的所有列名正在数据中使用。但是,如果该向量包含的名称多于使用的名称,则代码将引发错误。例如,如果我将“H”添加到nm1向量。这会导致错误:错误:字符串必须匹配列名称。未知列:H.是否有解决方案。 TIA – Acinonyx

+0

@akrun上面的Q – Acinonyx