我想在R里做一个有点复杂的任务.
我有一个data frame(为简单起见)三列.
第1列是一个字符串.
第2列是整数.
第3列是整数.
我想获取包含第1列中某个子字符串并且第2列具有精确值的所有观察结果,并将第3列替换为数字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))
Run Code Online (Sandbox Code Playgroud)
并且,我想选择第1列包含bob和第2列== 1的观察结果,并将第3列更改为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)
Run Code Online (Sandbox Code Playgroud)
我想在一个非常非常大的数据集中做到这一点.拆分数据集并将其重新组合在一起是不可行的.我尝试过使用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
Run Code Online (Sandbox Code Playgroud)
要读取代码,您应该将其视为:"对于x列'x1'具有"bob'且列'x2'等于1的每一行,...您将值1分配给列'x3'."如果你想拥有一个具有该值的新对象,你可以复制x y <- x并使用它来代替它.