【问题标题】:how to loop through columns in R如何遍历R中的列
【发布时间】:2015-12-05 00:23:26
【问题描述】:

我有一个非常大的数据集,包括 250 个字符串和数字变量。我想将一个接一个的列一起比较。例如,我将比较(差异)第一个变量与第二个变量,第三个变量与第四个变量,第五个变量与第六个变量,依此类推。
例如(数据集的结构类似于这个例子),我想比较 number.x 和 number.y,day.x 和 day.y,school.x 和 school.y 等等。

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) 

【问题讨论】:

  • 你花哨的弯曲引号在传递给 R 时不起作用。此外,“比较”可能意味着任何东西。
  • 与大多数编程语言不同,“.”不表示数据框或对象的成员:即 number.x 和 number.y 是 2 个完全不同的向量。当您说比较时,比较具体是什么?例如,如果您输入number.y == number.x,您将获得一个与 number.x(或 number.y)长度相同的向量,其中 TRUE 和 FALSE 条目指示它们在哪里相等。这是你要找的吗?
  • 感谢您的回复。例如(对于数字) number.x 和 number.y 之间的差异是否为 0 。两个字符串列之间的比较也意味着我们是否有相同的元素。
  • 请用您想要的结果修改您的问题。
  • 例如:number.x

标签: r


【解决方案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

要获得kk+1 列之间的比较结果,请查看comp(k+1)/2 元素-即要获得第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

【讨论】:

  • 嗨,感谢您的评论,是的,我正在寻找这个。但问题是因为我的数据集中有 300 个变量。我正在寻找一种方法来比较一个接一个的列。你对此有什么想法吗?
  • 只是为了确保我理解:您想将第 1 列与 2、3 与 4、... k 与 k+1、k+2 与 k+3 等进行比较。对吗?跨度>
  • 非常感谢您的帮助。有没有办法让每个比较与列中两个变量之间的比较相关。我的意思是在 comp1、comp2、comp3 和 comp4 的数据集中有 4 个新列?
猜你喜欢
  • 2020-09-21
  • 2014-12-05
  • 1970-01-01
  • 2016-09-19
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2010-12-09
相关资源
最近更新 更多