2017-07-29 122 views
0

我有這樣的數據幀複製行:得到具有不同值的一列在另一列

A = data.frame(a = c("q", "e", "f", "q"), b = 1:4) 

我想2行(複製●在A,具有不同的值,在B 1,4)

+3

你可以粘貼一些你已經嘗試過的代碼嗎? – Syfer

+2

你能編輯你的文章以包含所需的確切輸出嗎? –

回答

0
library("data.table") 
setDT(A) 
rbind(A, A[a == "q", .(a, b = c(1, 4))]) 
# a b 
# 1: q 1 
# 2: e 2 
# 3: f 3 
# 4: q 4 
# 5: q 1 
# 6: q 4 
1

我想你想要的功能duplicated

A[A$a %in% A$a[duplicated(A$a)],] 
# a b 
# 1 q 1 
# 4 q 4 

這會給你包含值的任何行在data.frame中找到2次或更多次。

@Sotos提出這一點,這是20%的速度在100.000行:

A[duplicated(A$a)|duplicated(A$a, fromLast = TRUE),] 

@穆罕默德 - nidabdella提出了dplyr這個解決方案,它是2.5倍的速度:

A %>% group_by(a) %>% filter(n()>1) 

基準:

A = data.frame(a =sample(letters,100000,replace=TRUE), b = 1:100000) 
library(microbenchmark) 

microbenchmark(
    a = A[A$a %in% A$a[duplicated(A$a)],], 
    b =A[duplicated(A$a)|duplicated(A$a, fromLast = TRUE),], 
    c = A[A$a %in% unique(A$a[duplicated(A$a)]),], 
    d = A %>% group_by(a) %>% filter(n()>1), 
    times=100) 

# Unit: milliseconds 
# expr  min  lq  mean median  uq  max neval 
# a 23.549739 24.732701 27.71688 27.70747 28.463392 115.58251 100 
# b 20.703155 21.485692 24.66477 21.79380 24.790283 113.42992 100 
# c 23.215580 24.166518 26.83627 24.99078 27.824526 113.99780 100 
# d 8.647365 9.099141 10.17412 9.25546 9.548462 46.96581 100 
+0

如果是這樣,那麼'A [重複(A $ a)|重複(A $ a,fromLast = TRUE)]' – Sotos

+1

我可以補充一點,如果這是OP想要的輸出,那麼它可以使用'dplyr'包實現:'A%>%group_by(a)%>%filter(n()> 1)' –

+0

@Sotos感謝它有點快,我將它添加到答案 –

相關問題