在数据框中连接两列,使它们不包含相同的值

时间:2017-09-18 22:53:49

标签: r

的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

现在问题。

我需要将list2放入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

目前,当我加入数据框中的列时,第一列和第二列中都有很多行包含相同的值。

1 个答案:

答案 0 :(得分: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} 
}