堆叠两列

时间:2017-02-28 11:02:21

标签: r dataframe

我有一个简单的数据,我想以特定的方式合并两列。不幸的是,即使看起来很简单,我也找不到解决问题的方法。 所以我的数据看起来像这样:

Numbers Groups   
  1      A   
  2      A   
  3      B   
  4      C   
  5      C

最后,我想要这样的事情:

1  
2   
A   
3   
B   
4   
5   
C

6 个答案:

答案 0 :(得分:4)

鉴于Numbers是唯一的,

v1 <- c(t(df4))
v1[!duplicated(v1, fromLast = T)]
#[1] "1" "2" "A" "3" "B" "4" "5" "C"

如果有重复的Numbers,(简称Numbers = c(1, 1, 3, 4, 5)),那么我们可以在连接之前transformmake.uniquesub可用于从make.unique中删除小数 (在评论中使用@Jaap提到的unique方法只是为了让所有内容一气呵成),

sub('\\..*' ,'',unique(c(t(transform(df4, numbers = make.unique(as.character(numbers))))), 
                                                                          fromLast = TRUE))
#[1] "1" "1" "A" "3" "B" "4" "5" "C"

答案 1 :(得分:3)

我们可以使用Map

lst <- split(df1$Numbers, df1$Groups)
unlist(Map(`c`, lst, names(lst)), use.names = FALSE)
#[1] "1" "2" "A" "3" "B" "4" "5" "C"

答案 2 :(得分:2)

第五种方法:

d2 <- aggregate(V1 ~ V2, d, paste0, collapse = ',')

strsplit(do.call(paste, c(d2[2:1], sep = ',', collapse = ',')),',')[[1]]

给出:

[1] "1"  "2"  "A"  "33" "B"  "4"  "5"  "C" 

响应@docendodiscimus'评论:当数字由多个数字组成时,更新的解决方案也有效。当数字在每个组中不唯一时也是如此。

使用过的数据:

d <- read.table(text="1 A
2 A
2 A
33 B
4 C
5 C", header=FALSE)

答案 3 :(得分:2)

sapply的另一个选项。对于V1的每个唯一值,提取其相应的值并使用c将它们组合在一起。

unlist(sapply(unique(df$V2), function(x) c(df$V1[df$V2 %in% x], x),
                                                        USE.NAMES = FALSE))

#[1] "1" "2" "A" "3" "B" "4" "5" "C"

答案 4 :(得分:1)

以下是基础R的解决方案:

d <- read.table(header=TRUE, text=
"Numbers Groups
1 A
2 A
3 B
4 C
5 C")

unlist(lapply(split(d, d$Groups), function(x) c(x$Numbers, as.character(x$Groups[1]))))
#  A1  A2  A3  B1  B2  C1  C2  C3 
# "1" "2" "A" "3" "B" "4" "5" "C" 

答案 5 :(得分:0)

以下是100%tidyverse解决方案:

library(tidyverse)
df %>%
  group_by(Groups) %>%
  summarize(output= list(c(Numbers,Groups[1]))) %>%
  unnest(output) %>%
  pull(output)

# [1] "1" "2" "A" "3" "B" "4" "5" "C"

我最短的:

unname(unlist(t(nest(df,Numbers)[2:1]))

最后我自己的100%基础解决方案:

with(aggregate(Numbers ~ Groups,df,list),unlist(Map(c,Numbers,Groups),use.names = F))

或者

unlist(by(df,df$Groups,function(x) c(x$Numbers,x$Groups[1])),use.names = F)