我正在尝试创建一个新的列,该列计算各列中大于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
对于将来如何处理此类问题的任何帮助和提示,我将不胜感激。
答案 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