跨列的条件计算

时间:2019-06-24 12:15:43

标签: r

我正在尝试创建一个新的列,该列计算各列中大于5的数字的数量。对于每个大于5的数字,我想在新列中添加20。

我是R的初学者(已经有几年了:),循环方法对我来说是个威吓。我想知道是否有简单的tydivere选项。

示例数据集:

df <- data.frame(name = paste0("name", 1:7),
            X1 = c(-1:5),
            X2 = c(1:7),
            X3 = c(2:8),
            X4 = c(3:9),
            X5 = c(4:10),
            X6 = c(5:11))

DesiredOutcome <- c(0,20,40,60,80,100,100)
df <- cbind(df, DesiredOutcome)
df

对于将来如何处理此类问题的任何帮助和提示,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

我们可以使用rowSums计算每行中大于5的值的数量,并将它们乘以20以得到最终输出。

df$output <- rowSums(df[-1] > 5) * 20

df
#   name X1 X2 X3 X4 X5 X6 output
#1 name1 -1  1  2  3  4  5      0
#2 name2  0  2  3  4  5  6     20
#3 name3  1  3  4  5  6  7     40
#4 name4  2  4  5  6  7  8     60
#5 name5  3  5  6  7  8  9     80
#6 name6  4  6  7  8  9 10    100
#7 name7  5  7  8  9 10 11    100

添加一些替代方法

使用apply

apply(df[-1] > 5, 1, sum) * 20
#[1]   0  20  40  60  80 100 100

使用sapply

rowSums(sapply(df[-1], function(x) x > 5)) * 20
#[1]   0  20  40  60  80 100 100

或与tidyverse

library(tidyverse)
df %>%  mutate(output = rowSums(.[-1] > 5) * 20)

df %>%  mutate(output = pmap_dbl(.[-1], ~ sum(c(...) > 5) * 20))

答案 1 :(得分:0)

有了base R,我们可以做到

df$output <- Reduce(`+`, lapply(df[-1], `>`, 5)) * 20
df$output
#[1]   0  20  40  60  80 100 100

或者在tidyverse

library(tidyverse)
df %>% 
    mutate(output = map(.[-1], `>`, 5) %>% 
           reduce(`+`) * 20)
#     name X1 X2 X3 X4 X5 X6 output
#1 name1 -1  1  2  3  4  5      0
#2 name2  0  2  3  4  5  6     20
#3 name3  1  3  4  5  6  7     40
#4 name4  2  4  5  6  7  8     60
#5 name5  3  5  6  7  8  9     80
#6 name6  4  6  7  8  9 10    100
#7 name7  5  7  8  9 10 11    100