R中单个IF循环中的多个条件

时间:2016-08-05 08:14:10

标签: r

我对R很新,并且有一些工作经验,但不是很流利。 我最近在一个大数据集上处理数据集,并使用R 3.3.1。 在数据框(X)中,有一列标志类型和2列数字类型,即高度和重量。

值类似于:

h        w       hw_flag  
5.874  60.5478    0
4.874  40.5478    0
3.874  10.5478    1
2.999  6.5478     1
8.874  90.5478    0
5.111   50.5478   1
6.554   65.5478   0

我已将两个新列初始化为h_1和w_1为0。

X$h_1 <- 0
X$w_1 <- 0

现在,我想要的是,只要hw_flag为1,那么h_1和w_1将分别从h和w复制条目,然后,一旦将值复制到h_1和w_1,相应的h和w值应该转0.我希望在一个循环中完成所有操作。

现在,我必须为这4个步骤编写4个循环。我工作的代码如下,它给了我想要的输出:

for(i in 1:nrow(X)){
  if(X$hw_flag[i] == '1') 
    X$h_1[i] <- X$h[i];
}

for(i in 1:nrow(X)){
  if(X$hw_flag[i] == '1') 
    X$w_1[i] <- X$w[i];
}

for(i in 1:nrow(X)){
  if(X$hw_flag[i] == '1') 
    X$h[i] <- 0;
}

for(i in 1:nrow(X)){
  if(X$hw_flag[i] == '1') 
    X$w[i] <- 0;
}

Output :

h        w            hw_flag   h_1   w_1  
5.874  60.5478           0       0    0
4.874  40.5478           0       0    0
0        0               1     3.874  10.5478
0        0               1     2.999  6.5478      
8.874  90.5478           0      0     0
0         0              1     5.111  50.5478  
6.554   65.5478          0       0     0

我尝试将所有内容放在一个if循环中但当然我遇到的问题是第一步按预期执行,而第二步无法正常工作。我尝试过;并通过回车换行,但仍然无法解决问题。 我尝试的代码是关注的,它将h值复制到h_1,但在下一步中,它没有将w的值复制到w_1:

for(i in 1:nrow(X)) {
  if(X$hw_flag[i] == '1') 
    X$h_1[i] <- X$h[i];
    X$w_1[i] <- X$w[i];
  X$h[i] <- 0;
  X$w[i] <- 0;
  }

所以,我基本上想知道如何为同一个IF-Yes块添加多个then语句。

2 个答案:

答案 0 :(得分:3)

无需循环。只需找到hw_flag等于1的位置,然后复制数据,然后将零覆盖hw

xy <- read.table(text = "h        w       hw_flag  
5.874  60.5478    0
                 4.874  40.5478    0
                 3.874  10.5478    1
                 2.999  6.5478     1
                 8.874  90.5478    0
                 5.111   50.5478   1
                 6.554   65.5478   0", header = TRUE)

xy$h_1 <- 0
xy$w_1 <- 0

hwflag1 <- xy$hw_flag == 1
xy[hwflag1, c("h_1", "w_1")] <- xy[hwflag1, c("h", "w")]
xy[hwflag1, c("h", "w")] <- 0

      h       w hw_flag   h_1     w_1
1 5.874 60.5478       0 0.000  0.0000
2 4.874 40.5478       0 0.000  0.0000
3 0.000  0.0000       1 3.874 10.5478
4 0.000  0.0000       1 2.999  6.5478
5 8.874 90.5478       0 0.000  0.0000
6 0.000  0.0000       1 5.111 50.5478
7 6.554 65.5478       0 0.000  0.0000

答案 1 :(得分:0)

要运行的命令应该包含在大括号中:

for(i in 1:nrow(X)) { 
    if(X$hw_flag[i] == '1') {
        X$h_1[i] <- X$h[i]
        X$w_1[i] <- X$w[i]
        X$h[i] <- 0
        X$w[i] <- 0
    }
}