我对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语句。
答案 0 :(得分:3)
无需循环。只需找到hw_flag
等于1的位置,然后复制数据,然后将零覆盖h
和w
。
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
}
}