堆栈两列
问题描述:
我得到了一个简单的数据,我想合并两列,但以特定的方式。不幸的是,即使它看起来很简单,我也没有找到解决我的问题的方法。 所以我的数据看起来是这样的:堆栈两列
Numbers Groups
1 A
2 A
3 B
4 C
5 C
最后,我想有这样的事情:
1
2
A
3
B
4
5
C
答
这里是基础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"
答
鉴于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)
),那么我们可以在连接之前transform
和make.unique
。 sub
可用于从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"
答
我们可以使用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"
+1
@akrum它适合我,谢谢:) – BaptM
答
第五方法:
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"
在respons到@docendodiscimus'注释:更新的解决方案也适用,当数由一个以上的数字&还当数不是每一组中是唯一的。
使用的数据
d <- read.table(text="1 A
2 A
2 A
33 B
4 C
5 C", header=FALSE)
答
与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"
答
这里有一个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)
或:'唯一的(C(T(DF4)),fromLast = TRUE)' – Jaap
这是一个相当强的假设只要OP尚未指定它 –
@docendodiscimus真。 – Sotos