鉴于以下数据:
df <- data.frame(x1 = c(1,2,3,4,5),
x2 = c(5,4,3,2,1))
我想变异一个新列(x3),它是x1和x2列之和。但是,在计算之前,我想有条件地替换这些数值,以便:
1 = 0
2 = 1
3 = 2
4 = 3
5 = 3
这将导致出现以下变异列:
x3
3
4
4
4
3
到目前为止,我的解决方案包括修改包含替换值的新x1和x2列,然后再将这些值相加,然后删除变异的x1和x2,但这似乎非常低效。
发布于 2022-07-07 20:24:36
在base R
中,我们可以从数据中减去1,使用pmin
限制大于3到3的值,并得到rowSums
df$x3 <- rowSums(pmin(as.matrix(df-1), 3))
-output
> df
x1 x2 x3
1 1 5 3
2 2 4 4
3 3 3 4
4 4 2 4
5 5 1 3
发布于 2022-07-07 20:55:34
下面是一个dplyr
解决方案:
library(dplyr)
df %>%
mutate(across(, ~ifelse(. > 3, 3,. - 1), .names = "new_{.col}")) %>%
mutate(x3 = rowSums(.[3:4]))
x1 x2 new_x1 new_x2 x3
1 1 5 0 3 3
2 2 4 1 3 4
3 3 3 2 2 4
4 4 2 3 1 4
5 5 1 3 0 3
发布于 2022-07-07 20:38:04
另一种可能的解决方案,在base R
中
z <- c(0, 1:3, 3)
df$x3 <- z[df$x1] + z[df$x2]
df
#> x1 x2 x3
#> 1 1 5 3
#> 2 2 4 4
#> 3 3 3 4
#> 4 4 2 4
#> 5 5 1 3
还有另一个base R
解决方案:
z <- c(0, 1:3, 3)
df$x3 <- rowSums(sapply(df, \(x) z[x]))
df
#> x1 x2 x3
#> 1 1 5 3
#> 2 2 4 4
#> 3 3 3 4
#> 4 4 2 4
#> 5 5 1 3
或使用tidyverse
library(tidyverse)
z <- c(0, 1:3, 3)
df %>%
mutate(x3 = rowSums(map_dfc(., ~ z[.x])))
#> x1 x2 x3
#> 1 1 5 3
#> 2 2 4 4
#> 3 3 3 4
#> 4 4 2 4
#> 5 5 1 3
https://stackoverflow.com/questions/72903788
复制相似问题