的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
目前,当我加入数据框中的列时,第一列和第二列中都有很多行包含相同的值。
答案 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}
}