我正在尝试根据特定条件替换列中的值,并将该数据框分配给另一个名称。但是每当我调用指定的名称时,我只得到改变的值,而不是整个数据。我在这里失踪了什么?我是初学者,所以给我一些懈怠: - )
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
当我打电话取代时,为什么我没有得到整个数据集?
谢谢你!答案 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。