Вариант может быть split
данных в list
из data.frame
с и получить rowMeans
nm1 <- sub("\\.\\d+$", "", names(df1))
df1[paste0(unique(nm1), ".mean")] <- sapply(split.default(df1,
sub("\\.\\d+$", "", names(df1))), rowMeans, na.rm = TRUE)
df1
# V1.1 V1.2 V1.3 V1.4 V1.5 V1.6 V1.7 V1.8 V1.9 V2.1 V1.mean V2.mean
#1 5 4 5 NA NA NA NA NA NA 5 4.666667 5
#2 5 5 5 NA NA NA NA NA NA 3 5.000000 3
#3 5 5 5 5 NA NA NA NA NA 4 5.000000 4
#4 5 4 5 NA NA NA NA NA NA 3 4.666667 3
#5 5 5 NA NA NA NA NA NA NA 2 5.000000 2
#6 5 5 5 5 NA NA NA NA NA 1 5.000000 1
#7 5 5 5 4 4 NA NA NA NA 5 4.600000 5
#8 5 5 5 4 5 5 NA NA NA 4 4.833333 4
#9 4 5 5 5 4 NA NA NA NA 1 4.600000 1
#10 5 5 5 NA NA NA NA NA NA 5 5.000000 5
или с использованием той же логики в цепочке приливов и отливов
library(tidyverse)
df1 %>%
split.default(nm1) %>%
map_dfc(rowMeans, na.rm = TRUE) %>%
rename_all(~ str_c(., ".mean")) %>%
bind_cols(df1, .)
data
df1 <- structure(list(V1.1 = c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 4L, 5L
), V1.2 = c(4L, 5L, 5L, 4L, 5L, 5L, 5L, 5L, 5L, 5L), V1.3 = c(5L,
5L, 5L, 5L, NA, 5L, 5L, 5L, 5L, 5L), V1.4 = c(NA, NA, 5L, NA,
NA, 5L, 4L, 4L, 5L, NA), V1.5 = c(NA, NA, NA, NA, NA, NA, 4L,
5L, 4L, NA), V1.6 = c(NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA),
V1.7 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), V1.8 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA), V1.9 = c(NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA), V2.1 = c(5L, 3L, 4L, 3L, 2L,
1L, 5L, 4L, 1L, 5L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10"))