R - for循环比较同一数据集中的列

时间:2018-04-03 11:48:03

标签: r for-loop compare

我有两个连续年份的几个国家的某些经济指标清单。国家是一行,每个经济指标是每年的一列(V1_2015和V1_2016是我想要比较的变量。

我想循环来比较变量。幸运的是,列的顺序正确,所以我想我可以循环。我不是for循环的专业人士,但我认为我非常接近......

Economics_2_years <- as.data.frame(cbind(
                    CountryID = c(9999,8888,7777,6666,5555,4444,3333,2222,1111,1234),
                    V1_2015 = c(1,1,1,1,1,1,1,1,1,1),
                    V2_2015 = c(2,2,2,2,2,2,2,2,2,2),
                    V3_2015 = c(3,3,3,3,3,3,3,3,3,3),
                    V1_2016 = c(1,2,1,2,1,2,1,2,1,2),
                    V2_2016 = c(9,1,2,5,3,2,1,2,2,2),
                    V3_2016 = c(0,0,0,0,0,0,0,0,0,0)))


Economics_Change <- as.data.frame(matrix(nrow = 10, ncol = 4))
Economics_Change$V1 <- Economics_Change$CountryID

for (i in 2:4){
for (j in 5:7){
for (k in 2:4)
  Economics_Change[,k]  <- Economics_2_years[,i]==Economics_2_years[,j]

} }

目的是在“Economics_Change”中存储变量是否已更改。如果他们改变了哪些,那么。

1 个答案:

答案 0 :(得分:0)

R是一种矢量化编程语言,因此您可以这样做而不是for循环:

    Economics_Change$V1 <- Economics_2_years$V1_2015==Economics_2_years$V1_2016
    Economics_Change$V2 <- Economics_2_years$V2_2015==Economics_2_years$V2_2016
    Economics_Change$V3 <- Economics_2_years$V3_2015==Economics_2_years$V3_2016

或者如果有很多列,但是你可以做一些与你的名字一致的事情:

cols <- lapply(1:3, function(var_number) {
  Economics_2_years[paste("V", var_number, "_2015", sep="")] == Economics_2_years[paste("V", var_number, "_2016", sep="")]
})
 results_df <- do.call("cbind", cols)

如果名称更复杂,那么V + number + _year或者数字有差距就是一个例子,你可以用它来处理它。

Economics_2_years <- as.data.frame(cbind(
  CountryID = c(9999,8888,7777,6666,5555,4444,3333,2222,1111,1234),
  VVV1_2015 = c(1,1,1,1,1,1,1,1,1,1),
  VE7_2015 = c(2,2,2,2,2,2,2,2,2,2),
  V10_2015 = c(3,3,3,3,3,3,3,3,3,3),
  VVV1_2016 = c(1,2,1,2,1,2,1,2,1,2),
  VE7_2016 = c(9,1,2,5,3,2,1,2,2,2),
  V10_2016 = c(0,0,0,0,0,0,0,0,0,0)))


colnames(Economics_2_years) %>% regmatches(., gregexpr("^(.*?)_", .)) %>% unlist() %>% unique() -> names_roots
cols <- lapply(names_roots, function(root) {
  Economics_2_years[paste(root, "2015", sep="")] == Economics_2_years[paste(root, "2016", sep="")]
})
results_df <- do.call("cbind", cols)