首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过从有条件替换值的其他列中计算,r Dplyr会变异新列。

通过从有条件替换值的其他列中计算,r Dplyr会变异新列。
EN

Stack Overflow用户
提问于 2022-07-07 20:20:56
回答 3查看 155关注 0票数 3

鉴于以下数据:

代码语言:javascript
运行
复制
df <- data.frame(x1 = c(1,2,3,4,5),
                 x2 = c(5,4,3,2,1))

我想变异一个新列(x3),它是x1和x2列之和。但是,在计算之前,我想有条件地替换这些数值,以便:

代码语言:javascript
运行
复制
1 = 0    
2 = 1   
3 = 2   
4 = 3   
5 = 3  

这将导致出现以下变异列:

代码语言:javascript
运行
复制
x3 
3   
4   
4   
4   
3  

到目前为止,我的解决方案包括修改包含替换值的新x1和x2列,然后再将这些值相加,然后删除变异的x1和x2,但这似乎非常低效。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-07 20:24:36

base R中,我们可以从数据中减去1,使用pmin限制大于3到3的值,并得到rowSums

代码语言:javascript
运行
复制
df$x3 <- rowSums(pmin(as.matrix(df-1), 3))

-output

代码语言:javascript
运行
复制
> df
  x1 x2 x3
1  1  5  3
2  2  4  4
3  3  3  4
4  4  2  4
5  5  1  3
票数 3
EN

Stack Overflow用户

发布于 2022-07-07 20:55:34

下面是一个dplyr解决方案:

代码语言:javascript
运行
复制
library(dplyr)

df %>% 
  mutate(across(, ~ifelse(. > 3, 3,. - 1), .names = "new_{.col}")) %>% 
  mutate(x3 = rowSums(.[3:4]))
代码语言:javascript
运行
复制
   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
票数 3
EN

Stack Overflow用户

发布于 2022-07-07 20:38:04

另一种可能的解决方案,在base R

代码语言:javascript
运行
复制
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解决方案:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72903788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档