Как умножить всю строку на соответствующее имя строки в другом фрейме данных? - PullRequest
6 голосов
/ 18 июня 2020

Предположим, у меня есть следующие кадры данных:

    test <- data.frame(X = c(1,2,3), Y = c(4,5,6), row.names = c("T1", "T2", "T3"))

    test2 <- data.frame(mean = c(1,2,5), row.names = c("T1", "T2", "T3"))

Я хочу умножить все строки в тестовом кадре данных на значение в кадре данных test2, соответствующее имени строки. Как мне это сделать, чтобы получить такой ответ:

    answer <- data.frame(X = c(1,4,15), Y = c(4,10,30), row.names = c("T1", "T2", "T3"))

Ответы [ 4 ]

5 голосов
/ 18 июня 2020

Можно сделать

test * test2[rownames(test), "mean"]
#     X  Y
# T1  1  4
# T2  4 10
# T3 15 30
4 голосов
/ 18 июня 2020

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

library(tidyverse)

test %>% 
 rownames_to_column('id') %>% 
 left_join(test2 %>% rownames_to_column('id'), by = 'id') %>% 
 mutate_at(vars(c('X', 'Y')), list(~ . * mean)) %>% 
 select(-mean)

#  id  X  Y
#1 T1  1  4
#2 T2  4 10
#3 T3 15 30
3 голосов
/ 18 июня 2020

Просто отправляю, потому что я уже работал над этим. Практически то же решение, что и @Sotos, но с across:

library(dplyr)
test %>% 
  rownames_to_column() %>% 
  left_join(test2 %>% rownames_to_column()) %>% 
  mutate(across(X:Y, ~.*mean)) %>% 
  select(-mean)

Joining, by = "rowname"
  rowname  X  Y
1      T1  1  4
2      T2  4 10
3      T3 15 30
1 голос
/ 18 июня 2020

Я бы сделал следующее:

x <- test %>% 
      rownames_to_column("id") %>% 
      left_join(test2 %>% rownames_to_column("id"), by = "id") %>%
      mutate_at(vars(colnames(test)), list(~ . * mean)) %>% 
      select(-mean)

если у вас есть столбцы с одинаковыми именами (например, два столбца с именем X), они будут помечены как X.1 и X.2. Если вы хотите избавиться от полной остановки и всего, что после нее, я бы сделал:

colnames(x) <- str_replace(colnames(x),"\\..*","")

Надеюсь, это поможет

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