Запись для l oop в r для объединения столбцов с совпадающими именами (с небольшой дисперсией) - PullRequest
1 голос
/ 02 апреля 2020

У меня есть фрейм данных, в котором имена столбцов дублируются один раз. Теперь мне нужно объединить их, чтобы получить правильный набор данных. Я могу использовать команду dplyr select, чтобы извлечь соответствующие столбцы и объединить их позже. Тем не менее, я буду sh, чтобы достичь этого, используя for l oop.

#Example data frame

x <- c(1, NA, 3)
y <- c(1, NA, 4)
x.1 <- c(NA, 3, NA)
y.1 <- c(NA, 5, NA)

data <- data.frame(x, y, x1, y1)

##with `dplyr` I can do like 

t1 <- data%>%select(contains("x"))%>%
mutate(x = rowSums(., na.rm = TRUE))%>%
select(x)
t2 <- data%>%select(contains("y"))%>%
mutate(y = rowSums(., na.rm = TRUE))%>%
select(y)

data <- cbind(t1,t2)

Это громоздко, так как у меня более 25 похожих столбцов

Как добиться того же результата, используя для l oop путем сопоставления имен столбцов и выполнить rowSums. Или даже простой подход с использованием dplyr также поможет.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2020

Мы можем использовать split.default для разделения на основе подстроки имен столбцов на list, а затем применить rowSums

library(dplyr)
library(stringr)
library(purrr)
data %>%
    split.default(str_remove(names(.), "\\.\\d+")) %>%
    map_dfr(rowSums, na.rm = TRUE)
# A tibble: 3 x 2
#      x     y
#  <dbl> <dbl>
#1     1     1
#2     3     5
#3     3     4

Если мы хотим использовать for l oop

un1 <- unique(sub("\\..*", "", names(data)))
out <- setNames(rep(list(NA), length(un1)), un1)
for(un in un1) {
     out[[un]] <- rowSums(data[grep(un, names(data))], na.rm = TRUE)
 }
as.data.frame(out)

data

data <- structure(list(x = c(1, NA, 3), y = c(1, NA, 4), x.1 = c(NA, 
3, NA), y.1 = c(NA, 5, NA)), class = "data.frame", row.names = c(NA, 
-3L))
3 голосов
/ 02 апреля 2020

Использование purrr::map_dfc и transmute вместо mutate

library(dplyr)
purrr::map_dfc(c('x','y'), ~data %>% select(contains(.x)) %>% 
                                     transmute(!!.x := rowSums(., na.rm = TRUE)))

  x y
1 1 1
2 3 5
3 3 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...