如何分配相同的数据,但在R中有条件地更改列值

时间:2017-10-17 02:14:14

标签: r

我正在尝试根据特定条件替换列中的值,并将该数据框分配给另一个名称。但是每当我调用指定的名称时,我只得到改变的值,而不是整个数据。我在这里失踪了什么?我是初学者,所以给我一些懈怠: - )

test = data.frame(a=1:5,b=6:10,c=7:11)
replaced = test$b[test$b>7& test$b<=9]=0
replaced
#[1] 0

当我打电话取代时,为什么我没有得到整个数据集?

谢谢你!

2 个答案:

答案 0 :(得分:1)

先取一份,然后替换:

test=data.frame(a=1:5,b=6:10,c=7:11)
replaced <- test
replaced$b[replaced$b>7& replaced$b<=9] <- 0
replaced

#  a  b  c
#1 1  6  7
#2 2  7  8
#3 3  0  9
#4 4  0 10
#5 5 10 11

您的原始问题是由于从右到左分配的作业:

x <- y <- 0
x
#[1] 0
y
#[1] 0

执行单个分配比 更快,而不是循环遍历每一行:

test2 <- test[rep(1:5,3e4),]
nrow(test2)
#[1] 150000

system.time({
  replaced <- test2
  replaced$b[replaced$b>7& replaced$b<=9] <- 0
})
#   user  system elapsed 
#      0       0       0 


system.time({
  i=1
  for ( i in 1:nrow(test2))
  { 
    if(test2[i,]$b>7& test2[i,]$b<=9){
     test2[i,]$b=0 
    }
  }
})
#   user  system elapsed 
# 210.69    0.01  211.69 

答案 1 :(得分:0)

你可以尝试这样的事情 -

test=data.frame(a=1:5,b=6:10,c=7:11)

i=1
for ( i in 1:nrow(test))
{ 
  if(test[i,]$b>7& test[i,]$b<=9){
   test[i,]$b=0 
  }
}

这会将b的值更改为8-9到0。