объединить строки в r, суммируя значения и объединяя символы; объединение уровней факторов - PullRequest
1 голос
/ 20 июня 2019

Я хочу объединить две или более строки, чтобы числовые значения для переменных (v1..5) суммировались, а символьные значения, которые являются уровнями факторов, объединялись следующим образом:

R1, 0 1 1 1 1, д е ф
R2, 1 3 0 1 2, л к с

объединение R1 и R2

R1R2, 2 4 1 2 3 дл экшн

[введите описание изображения здесь] [1]

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Одна dplyr возможность может быть:

df %>%
 group_by(group = gl(n()/2, 2)) %>%
 mutate_at(vars(starts_with("v")), sum) %>%
 mutate_at(vars(starts_with("f")), toString) %>%
 summarise_all(first) %>%
 ungroup() %>%
 select(-group)

     v1    v2    v3    v4    v5 fa    fb    fc   
  <int> <int> <int> <int> <int> <chr> <chr> <chr>
1     2     4     1     2     3 d, l  e, k  f, s 

Здесь он присваивает каждые две строки одной и той же группе, суммирует переменные, начиная с v, и объединяет переменные, начиная с f.

Или то же самое в зависимости от класса переменной:

df %>%
 group_by(group = gl(n()/2, 2)) %>%
 mutate_if(is.numeric, sum) %>%
 mutate_if(is.character, toString) %>%
 summarise_all(first) %>%
 ungroup() %>%
 select(-group)
0 голосов
/ 20 июня 2019

Используя базу R lapply, мы можем проверить класс столбцов и принять соответствующие меры

data.frame(lapply(df, function(x) 
                 if(is.numeric(x)) sum(x) else paste0(x, collapse = "")))

#  v1 v2 v3 v4 v5 fa fb fc
#1  2  4  1  2  3 dl ek fs

Если мы хотим сделать это для каждых n строк, мы можем использовать aggregate

n <- 2
aggregate(.~rep(seq_len(nrow(df)), each  = n, length.out = nrow(df)), df, 
            function(x) if(is.numeric(x)) sum(x) else paste0(x, collapse = ""))[-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...