2017-02-28 89 views
4

我得到了一個簡單的數據,我想合併兩列,但以特定的方式。不幸的是,即使它看起來很簡單,我也沒有找到解決我的問題的方法。 所以我的數據看起來是這樣的:堆棧兩列

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

最後,我想有這樣的事情:

1 
2 
A 
3 
B 
4 
5 
C 

回答

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" 
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" 
+2

或:'唯一的(C(T(DF4)),fromLast = TRUE)' – Jaap

+0

這是一個相當強的假設只要OP尚未指定它 –

+0

@docendodiscimus真。 – Sotos

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" 
+1

@akrum它適合我,謝謝:) – BaptM

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" 

在respons到@docendodiscimus'註釋:更新的解決方案也適用,當數由一個以上的數字&還當數不是每一組中是唯一的。


使用的數據

d <- read.table(text="1 A 
2 A 
2 A 
33 B 
4 C 
5 C", header=FALSE) 
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" 
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)