2015-11-24 234 views
0

我有一个非常大的数据集,包括250个字符串和数字变量。我想一个接一个地把一个个的列比较一下。例如,我将比较(差异)第一个变量与第二个变量,第三个与第四个变量,第五个变量与第六个变量等等。
例如(数据集的结构类似于这个例子),我想比较number.x与number.y,day.x与day.y,school.x与school.y等。如何循环遍历R中的列

number.x<-c(1,2,3,4,5,6,7) 
number.y<-c(3,4,5,6,1,2,7) 
day.x<-c(1,3,4,5,6,7,8) 
day.y<-c(4,5,6,7,8,7,8) 
school.x<-c("a","b","b","c","n","f","h") 
school.y<-c("a","b","b","c","m","g","h") 
city.x<- c(1,2,3,7,5,8,7) 
city.y<- c(1,2,3,5,5,7,7) 
+0

当传递给R时,您的花式弯曲引号不起作用。此外,“比较”可能意味着任何事情。 – Frank

+0

与大多数编程语言不同,“。”不表示数据帧或对象的成员:即number.x和number.y是2个完全不同的向量。 当你说比较时,具体是什么比较?例如,如果输入'number.y == number.x',您将得到一个与number.x(或number.y)长度相同的向量,其中TRUE和FALSE条目指示它们在哪里相等。这是你在找什么? –

+0

感谢您的回复。例如(对于数字)number.x和number.y之间的差异是否为0。两个字符串列之间的比较也意味着我们是否拥有相同的元素。 – shadi

回答

1

你的意思是,这样的事情?

> number.x == number.y 
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE 
> length(which(number.x==number.y)) 
[1] 1 
> school.x == school.y 
[1] TRUE TRUE TRUE TRUE FALSE FALSE TRUE 
> test.day <- day.x == day.y 
> test.day 
[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE 

编辑:鉴于你上面的例子变量,我们有:

df <- data.frame(number.x, 
      number.y, 
      day.x, 
      day.y, 
      school.x, 
      school.y, 
      city.x, 
      city.y, 
      stringsAsFactors=FALSE) 

n <- ncol(df) # no of columns (assumed EVEN number) 

k <- 1 
comp <- list() # comparisons will be stored here 

while (k <= n-1) { 
     l <- (k+1)/2 
     comp[[l]] <- df[,k] == df[,k+1] 
     k <- k+2 
} 

在这之后,你必须:

> comp 
[[1]] 
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE 

[[2]] 
[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE 

[[3]] 
[1] TRUE TRUE TRUE TRUE FALSE FALSE TRUE 

[[4]] 
[1] TRUE TRUE TRUE FALSE TRUE FALSE TRUE 

要获得列k之间的比较结果和k+1,你可以看看comp(k+1)/2元素 - 即得到compari列7 & 8之间儿子的结果,你看看comp元素8/2=4

> comp[[4]] 
[1] TRUE TRUE TRUE FALSE TRUE FALSE TRUE 

编辑2:要使比较在数据帧新列:

new.names <- rep('', n/2) 
for (i in 1:(n/2)) { 
    new.names[i] <- paste0('V', i) 
} 

cc <- as.data.frame(comp, optional=TRUE) 
names(cc) <- new.names 

df.new <- cbind(df, cc) 

之后,你有:

> df.new 
    number.x number.y day.x day.y school.x school.y city.x city.y V1 V2 V3 V4 
1  1  3  1  4  a  a  1  1 FALSE FALSE TRUE TRUE 
2  2  4  3  5  b  b  2  2 FALSE FALSE TRUE TRUE 
3  3  5  4  6  b  b  3  3 FALSE FALSE TRUE TRUE 
4  4  6  5  7  c  c  7  5 FALSE FALSE TRUE FALSE 
5  5  1  6  8  n  m  5  5 FALSE FALSE FALSE TRUE 
6  6  2  7  7  f  g  8  7 FALSE TRUE FALSE FALSE 
7  7  7  8  8  h  h  7  7 TRUE TRUE TRUE TRUE 
+0

嗨,感谢您的评论,是的,我正在寻找这个。但问题是因为我的数据集中有300个变量。我正在寻找一种方法来将一个接一个的列连在一起。你有什么想法吗? – shadi

+0

只要我明白:你想比较第1列与第2,3列与第4列,...第k列与第k + 1列,第k + 2列与第k + 3列等等。是否正确? – desertnaut

+0

是的,你是对的。 – shadi