объединить столбцы в кадре данных с дублированными значениями во втором кадре данных в R - PullRequest
0 голосов
/ 25 октября 2018

У меня есть два df, и я хотел бы суммировать значения для тех имен столбцов, которые имеют одинаковое значение во втором кадре данных, скажем, первый df:

    file1  file2  file3  file4  file5  file6 file7
num1  1    0      3      1      4      1     11
num2  0    1      1      3      4      2     2
num3  2    0      0      0      1      1     2
num4 11    0      2      1      1      1     1
num5  3    1      0      1      0      0     0
num6  0    0      0      1      2      1     1

И второй df, data:

    Group  Link
      1    file1
      2    file2
      3    file3
      1    file4
      4    file5
      3    file6
      2    file7

И в конце я хотел бы иметь что-то вроде:

    file1_4  file2_7  file3_6  file5
num1  2       11        4        4
num2  3        3        3        4
num3  2        2        1        1
num4 12        1        3        1
num5  4        1        0        0
num6  1        1        1        2

Надеюсь, что это достаточно ясно Любая помощь будет приветствоваться!спасибо!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вот вариант tidyverse:

library(dplyr)
# modify df2 to define a more suitable Group variable
df2 <- df2 %>%
        mutate(Link2 = gsub("file", "", Link)) %>%
        group_by(Group) %>%
        mutate(Link2 = paste("file", paste(Link2, collapse = "_"),
                            sep = "")) %>%
        ungroup() %>% select(Link, Group = Link2)

# dplyr pipe chain
df1 %>%
        t() %>% as.data.frame() %>%
        tibble::rownames_to_column("Link") %>%
        left_join(df2, by = "Link") %>%
        group_by(Group) %>%
        transmute_at(vars(num1:num6), sum) %>%
        ungroup() %>% distinct() %>%
        t() %>% as.data.frame() %>%
        setNames(., as.character(unlist(.[1, ]))) %>%
        tail(., -1)

# output
     file1_4 file2_7 file3_6 file5
num1       2      11       4     4
num2       3       3       3     4
num3       2       2       1     1
num4      12       1       3     1
num5       4       1       0     0
num6       1       1       1     2

Данные

df1 <- structure(list(file1 = c(1L, 0L, 2L, 11L, 3L, 0L), file2 = c(0L, 
1L, 0L, 0L, 1L, 0L), file3 = c(3L, 1L, 0L, 2L, 0L, 0L), file4 = c(1L, 
3L, 0L, 1L, 1L, 1L), file5 = c(4L, 4L, 1L, 1L, 0L, 2L), file6 = c(1L, 
2L, 1L, 1L, 0L, 1L), file7 = c(11L, 2L, 2L, 1L, 0L, 1L)), .Names = c("file1", 
"file2", "file3", "file4", "file5", "file6", "file7"), class = "data.frame", row.names = c("num1", 
"num2", "num3", "num4", "num5", "num6"))

df2 <- structure(list(Group = c(1L, 2L, 3L, 1L, 4L, 3L, 2L), Link = c("file1", 
"file2", "file3", "file4", "file5", "file6", "file7")), .Names = c("Group", 
"Link"), class = "data.frame", row.names = c(NA, -7L))
0 голосов
/ 25 октября 2018

Так как мой комментарий был явно не тем, что вы хотели здесь, попробуйте еще раз:)

data_temp = read.table(text = "
index    file1  file2  file3  file4  file5  file6 file7
num1  1    0      3      1      4      1     11
                       num2  0    1      1      3      4      2     2
                       num3  2    0      0      0      1      1     2
                       num4 11    0      2      1      1      1     1
                       num5  3    1      0      1      0      0     0
                       num6  0    0      0      1      2      1     1"
                       , header = T, stringsAsFactors = F)


data_group = read.table(text = "
                            Group  Link
                        1    file1
                        2    file2
                        3    file3
                        1    file4
                        4    file5
                        3    file6
                        2    file7"
                        , header = T, stringsAsFactors = F)

data_desired = data.frame("index" = data_temp$index)

for(i in unique(data_group$Group)) # for loop over all groups
{
 data_to_group = data_group$Link[which(data_group$Group == i)]
 data_sum = rowSums(data_temp[data_to_group], na.rm = T)
 data_desired$data_sum = data_sum
 names(data_desired)[NCOL(data_desired)] = paste(data_to_group, collapse = "_")
}

data_desired
# index file1_file4 file2_file7 file3_file6 file5
# 1  num1           2          11           4     4
# 2  num2           3           3           3     4
# 3  num3           2           2           1     1
# 4  num4          12           1           3     1
# 5  num5           4           1           0     0
# 6  num6           1           1           1     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...