我有一个包含多个x列和y列的大型数据集,但下面显示了一个包含5列的示例

library(dplyr)
set.seed(505)
df <- data.frame(
x1 = sample(-2 : 4,size = 10, replace = TRUE),
x2 = sample(-2 : 4,size = 10, replace = TRUE),
x3 = sample(-2 : 4,size = 10, replace = TRUE),  
x4 = sample(-2 : 4,size = 10, replace = TRUE), 
x5 = sample(-2 : 4,size = 10, replace = TRUE),   
y1 = sample(-2 : 4,size = 10, replace = TRUE), 
y2 = sample(-2 : 4,size = 10, replace = TRUE),
y3 = sample(-2 : 4,size = 10, replace = TRUE),  
y4 = sample(-2 : 4,size = 10, replace = TRUE),  
y5 = sample(-2 : 4,size = 10, replace = TRUE))

我的任务可以通过下面的代码来实现

df |> mutate(
  sum1 = x1 * as.numeric(x1 > -1 & y1 > -1) +
         x2 * as.numeric(x2 > -1 & y2 > -1) +
         x3 * as.numeric(x3 > -1 & y3 > -1) +
         x4 * as.numeric(x4 > -1 & y4 > -1) +
         x5 * as.numeric(x5 > -1 & y5 > -1)

因为我有25个xy个变量,我的问题是:有没有更好的方法来实现同样的目标?

推荐答案

xs <- paste0("x", 1:5)
ys <- paste0("y", 1:5)

rowSums(df[xs] * (df[xs] > -1 & df[ys] > -1))

# Another alternative
foo <- \(x, y) replace(x, pmin(x, y) <= -1, 0)
rowSums(mapply(foo, df[xs], df[ys]))


# [1] 2 3 1 4 6 3 0 0 1 2

R相关问答推荐

R形式的一维数字线/箱形图样式图表

使用对管道内单元格的引用生成新变量

R Tidymodels textercipes-使用spacyR进行标记化-如何从生成的标记列表中删除标点符号

如何修复R码的置换部分?

为什么观察不会被无功值变化触发?

ggplot的轴标签保存在officer中时被剪切

使用case_match()和char数组重新编码值

将向量组合到一个数据集中,并相应地命名行

删除列表中存储的数据帧内和数据帧之间的重复行

R-更新面内部的栅格值

如何自定义3D散点图的图例顺序?

将一个字符串向量调整为与其他字符串向量完全相同的大小

在使用具有Bray-Curtis相似性的pvCluust时计算p值

将列的值乘以在不同数据集中找到的值

按组和连续id计算日期差

使用geom_sf跨越日期线时的闭合边界

使用函数从R中的列中删除标高

在ggplot2图表中通过端点连接点

将边列表转换为路径长度列表

如何在R中使用因子行求和?