如果列B <= 20,我想从列A的值中减去1。
A = c(1,2,3,4,5)
B = c(10,20,30,40,50)
df = data.frame(A,B)
输出
A B
1 0 10
2 1 20
3 3 30
4 4 40
5 5 50
我的数据非常庞大,所以我不想使用循环。 R中有什么计算有效的方法吗?
答案 0 :(得分:3)
你可以
df$A[df$B <= 20] <- df$A[df$B <= 20] - 1
# A B
#1 0 10
#2 1 20
#3 3 30
#4 4 40
#5 5 50
我们可以逐步分解以了解其工作原理。
首先,我们检查B
中的哪些数字小于等于20,从而得出逻辑矢量
df$B <= 20
#[1] TRUE TRUE FALSE FALSE FALSE
使用该逻辑向量,我们可以选择A
中的数字
df$A[df$B <= 20]
#[1] 1 2
从这些数字中减去1
df$A[df$B <= 20] - 1
#[1] 0 1
,并将这些值替换为A
中的相同索引。
有了dplyr
,我们也可以使用case_when
library(dplyr)
df %>%
mutate(A = case_when(B <= 20 ~ A - 1,
TRUE ~ A))
答案 1 :(得分:0)
另一种可能性:
df$A <- ifelse(df$B < 21, df$A - 1, df$A)
答案 2 :(得分:0)
这是一个data.table
解决方案:
library(data.table)
setDT(df)
df[B <= 20, A := A - 1]