2017-09-18 80 views
2

的sooo在數據幀連接兩個列,以便它們不包含相同的值

我有兩個列表

list1 <- rep(c("john","steve","lisa","sara","anna"), c(50,0,15,25,10)) 
list2 <- rep(c("john","steve","lisa","sara","anna"), c(15,25,0,10,50)) 

我需要把它們放入一個數據幀。

df <- as.data.frame(matrix(1, nrow = 100, ncol = 2)) 
df$v1 <- list1 

現在的問題。

我需要把列表2到DF $ V2 有任何行中包含DF值相同。 不要緊,什麼樣的價值觀是每個一行。

我用這個測試吧,如果每行包含相同的值:

all(apply(ballots, 1, function(x) length(unique(x)) == 2) == TRUE) 

澄清:

我需要在列,每列值,這行沒有關係。 我需要一種方法以隨機或以這樣的方式改變第二列的排列順序(或第一),該相同的值是從未在列中的一個或兩個

輸出:

V1  V2 
John Steve 
John Lisa 
Sara John 
John Lisa 
Steve Anna 

目前當我加入數據框中的列時,第一列和第二列中的許多行都包含相同的值。

+0

所以,你想返回'NA',如果它包含相同的值? – PoGibas

+0

我看到我需要澄清。 沒有我需要的列中的每個值,其中也無所謂。 我需要一種方法來隨機或更改第二列的排列順序以這樣的方式,相同的價值從來沒有在列一個或兩個 – Atius

+0

請張貼通緝輸出 – PoGibas

回答

0

好吧......終於發現了許多試驗和錯誤後的答案。

如果任何人有一個更清潔的方法來做到這一點,我希望能看到一個。

下面的代碼發生名單A,並把它在列A 取列表B,隨機化和在C列中所說,B欄是NA 如果A和C是不一樣的,開關列B和C. 如果它沒有完成所有的行,它重新開始,隨機化列C

library(taRifx) 

failed.counter <- 0 

while (failed.counter <= 1) { 
list1 <- rep(c("A","B","C"), c(3,1,2)) 
list2 <- sample(rep(c("A","B","C"), c(2,3,1))) 


df <- as.data.frame(matrix(NA, nrow = length(list1), ncol = 3)) 
df[,1] <- list1 
df[,3] <- list2 
iteration.counter <- 0 

while (anyNA(df$V2) == TRUE && failed.counter == 0) {  
     iteration.counter <- iteration.counter + 1 
     df.sub <- df[is.na(df[,2]) & df[,1] != df[,3] & !is.na(df[,3]),] 
     df.sub <- df.sub[,c("V1", "V3", "V2")] 
     colnames(df.sub) <- c("V1", "V2", "V3") 
     r.names <- rownames(df.sub) 
     df[r.names,] <- df.sub 

     df[,3] <- shift(df[,3], 1, Wrap=TRUE) 
     if(iteration.counter >= nrow(df)+1) {failed.counter <- 1} 

} 
if(anyNA(df$V2) == FALSE) {failed.counter <- 2} 
} 
相關問題