Могу ли я разделить каждый столбец фрейма данных, используя соответствующие значения из другого фрейма данных в R? - PullRequest
3 голосов
/ 17 июня 2020

У меня есть два фрейма данных в R, которые выглядят следующим образом:

#  A  B  C  D
#  4  12 1  6
#  3  5  3  8
#  6  1  9  4

, где A, B, C, D - имена столбцов, и

#  id  value
#  A   10
#  B   15
#  C   12
#  D   20

, где id и value - имена столбцов

Я пытаюсь написать код, чтобы разделить все значения в каждом столбце на «значение» из второго фрейма данных. Я пробовал искать здесь, используя некоторые пакеты и писать свои собственные циклы вручную, но ничего не работает. В моих фреймах данных есть тысячи столбцов, поэтому я не могу печатать их вручную. Пожалуйста, помогите и спасибо.

Ответы [ 3 ]

3 голосов
/ 17 июня 2020

В baseR вы можете сделать

df1 / split(df2$value, names(df1))
#    A          B          C   D
#1 0.4 0.80000000 0.08333333 0.3
#2 0.3 0.33333333 0.25000000 0.4
#3 0.6 0.06666667 0.75000000 0.2

split(df2$value, names(df1)) возвращает список, отсортированный по names(df1):

split(df2$value, names(df1)
#$A
#[1] 10
#
#$B
#[1] 15
#
#$C
#[1] 12
#
#$D
#[1] 20

df1 затем делится по столбцам значениями этого списка.

данные

df1 <- structure(list(A = c(4L, 3L, 6L), B = c(12L, 5L, 1L), C = c(1L, 
3L, 9L), D = c(6L, 8L, 4L)), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(id = c("A", "B", "C", "D"), value = c(10L, 15L, 
12L, 20L)), class = "data.frame", row.names = c(NA, -4L))
2 голосов
/ 17 июня 2020

Одно dplyr решение может быть:

df1 %>%
 rowwise() %>%
 mutate(across(everything())/df2$value)

      A      B      C     D
  <dbl>  <dbl>  <dbl> <dbl>
1   0.4 0.8    0.0833   0.3
2   0.3 0.333  0.25     0.4
3   0.6 0.0667 0.75     0.2
1 голос
/ 17 июня 2020

Вот вариант с deframe

library(tibble)
df1/deframe(df2)[col(df1)]
#   A          B          C   D
#1 0.4 0.80000000 0.08333333 0.3
#2 0.3 0.33333333 0.25000000 0.4
#3 0.6 0.06666667 0.75000000 0.2

Или используя match в base R

df1/df2$value[match(df2$id, names(df1))][col(df1)]

data

df1 <- structure(list(A = c(4L, 3L, 6L), B = c(12L, 5L, 1L), C = c(1L, 
3L, 9L), D = c(6L, 8L, 4L)), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(id = c("A", "B", "C", "D"), value = c(10L, 15L, 
12L, 20L)), class = "data.frame", row.names = c(NA, -4L))
...