我有以下数据框
id f1 f2
1 a 1 3
2 b 3 5
3 c 4 7
我想用行替换f1> 3的所有行(id = x,f1 = 0,f2 = 0) 所以上面的内容将映射到
id f1 f2
1 a 1 3
2 b 3 5
3 x 0 0
但是当我尝试
时replace(x,which(x$f1>3),data.frame(id = 'x',f1=0,f2=0))
它做得不对,它给了
id f1 f2
1 a 1 x
2 b 3 x
3 c 4 x
Warning message:
In `[<-.data.frame`(`*tmp*`, list, value = list(id = 1L, f1 = 0, :
provided 3 variables to replace 1 variables
有人可以提出一种大规模的方法吗?感谢。
答案 0 :(得分:10)
这样的事情:
x[x$f1 > 3,] <- data.frame('x', 0, 0)
应该做的伎俩!
根据@Ddin的评论,这不适用于因子id
列。使用相同的技术可以这样工作:
levels(x$id) <- c(levels(x$id), 'x')
x[x$f1 > 3,] <- data.frame('x', 0, 0)
droplevels(x$id)
答案 1 :(得分:1)
这是另一种方法(考虑到@Ddin的评论)
dfrm <- data.frame(id=letters[1:3], f1=c(1,3,4), f2=c(3,5,7))
dfrm[dfrm$f1>3, -1] <- 0
levels(dfrm$id) <- c(levels(dfrm$id), 'x')
dfrm[,1]<- with(dfrm, replace(id, f1==0, 'x')) ; dfrm
id f1 f2
1 a 1 3
2 b 3 5
3 x 0 0
使用更多数据:
set.seed(007); N <- 12
f1 <- sample(1:9, N, replace=TRUE)
f2 <- sample(1:9, N, replace=TRUE)
dfrm2 <- data.frame(id=letters[1:N], f1=f1, f2=f2)
dfrm2[dfrm2$f1>3, -1] <- 0
levels(dfrm2$id) <- c(levels(dfrm2$id), 'x')
dfrm2[,1]<- with(dfrm2, replace(id, f1==0, 'x')) ; dfrm2
id f1 f2
1 x 0 0
2 x 0 0
3 c 2 5
4 d 1 1
5 e 3 6
6 x 0 0
7 x 0 0
8 x 0 0
9 i 2 6
10 x 0 0
11 k 2 9
12 l 3 9
我删除了以前的代码,因为它们对此问题没用。