我正在尝试在 R 中完成一项有点复杂的任务。
我有一个 data frame
(为简单起见)三列。
第 1 列是一个字符串。
第 2 列是一个整数。
第 3 列是一个整数。
我想获取第 1 列中包含某个子字符串且第 2 列具有精确值的所有观察值,并将第三列替换为数字 1。
也就是说,我有以下dataframe
:
x <- data.frame(x1 = c("bob","jane","bob","bobby","bob","jane","bobby","bob","jane","bob"),
x2 = c(1,1,1,1,1,2,2,2,2,2),
x3 = c(13,22,3,34,10,23,53,42,13,35))
而且,我想选择第 1 列包含 bob 且第 2 列==1 的观察值,并将第三列更改为 1,这样我最终得到:
y1 <- c("bob","jane","bob","bobby","bob","jane","bobby","bob","jane","bob")
y2 <- c(1,1,1,1,1,2,2,2,2,2)
y3 <- c(1,22,1,1,1,23,53,42,13,35)
y <- data.frame(y1,y2,y3)
我想在一个非常非常大的数据集上执行此操作。拆分数据集并将其重新组合在一起是不可行的。
我尝试过使用 grep
,但是当我尝试同时进行两个匹配时它不起作用。另外,我尝试过子集,但是我必须拆分 dataframe
并将其重新组合在一起。
提前非常感谢。
最佳答案
R 具有使用 [<-
进行逻辑索引的能力函数,这真的很简单:
> x$x3[ grepl("bob", x$x1) & x$x2 == 1] <- 1
> x
x1 x2 x3
1 bob 1 1
2 jane 1 22
3 bob 1 1
4 bobby 1 1
5 bob 1 1
6 jane 2 23
7 bobby 2 53
8 bob 2 42
9 jane 2 13
10 bob 2 35
要阅读代码,您应该将其视为:“对于 x
的每一行,其中列 'x1' 具有 "bob' 并且列 'x2' 等于 1 ,...您将值 1 分配给列'x3'。”如果您想拥有一个具有该值的新对象,您可以使用 y <- x
制作 x 的副本,然后进行处理。
关于替换R中数据框中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33622146/