Если мы проверяем имена столбцов, то
library(tidyverse)
data %>%
mutate(count = pmap_int(.[-1], ~ {x1 <- c(...)
sum(x1 == names(x1))} ))
# id multi_value_col single_value_col_1 single_value_col_2 count
#1 1 A single_value_col_1 1
#2 2 D2 single_value_col_1 single_value_col_2 2
#3 3 Z6 single_value_col_2 1
Или в base R
rowSums(data[-1] == names(data)[-1][col(data[-1])])
Если у набора данных есть NA, просто измените его на
rowSums(data[-1] == names(data)[-1][col(data[-1])], na.rm = TRUE)
Другие варианты, предложенные @thelatemail, включают транспонирование выбранных столбцов и выполнение colSums
на логической матрице
nms <- names(data)[nm1]
colSums(t(data[nms]) == nms)
Или с Reduce
Reduce(`+`, Map(`==`, data[nms], nms))
Если целью является подсчет на основе непробелов, в base R
мы создаем логическую матрицу с интересующими столбцами и делаем rowSums
для нее
nm1 <- grep("single_value", names(data))
data$count <- rowSums(data[nm1] != "")
С dplyr
library(dplyr)
data %>%
mutate(count = rowSums(.[nm1] != ""))
# id multi_value_col single_value_col_1 single_value_col_2 count
#1 1 A single_value_col_1 1
#2 2 D2 single_value_col_1 single_value_col_2 2
#3 3 Z6 single_value_col_2 1
данные
data <- structure(list(id = 1:3, multi_value_col = c("A", "D2", "Z6"),
single_value_col_1 = c("single_value_col_1", "single_value_col_1",
""), single_value_col_2 = c("", "single_value_col_2", "single_value_col_2"
)), row.names = c(NA, -3L), class = "data.frame")