Умножать только столбцы с одинаковыми именами столбцов - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующий набор данных:

df1

Col1   Col2    A    B    C
   A      1    2    3    4
   B      2    5    7    8

df2

A    B     C   D    E
2    3     4   7   10

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

Окончательный ожидаемый результат:

Col1   Col2     A    B     C
   A      1     4    9    16
   B      2    10   21    32

У моего dataframe есть много столбцов, поэтому, если это может быть каким-либо образом динамическим, это было бы очень полезно.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018
nm <- intersect(names(df1), names(df2))
df1[nm] <- sweep(df1[nm], 2, unlist(df2[nm]), `*`)
df1
#   Col1 Col2  A  B  C
# 1    A    1  4  9 16
# 2    B    2 10 21 32

Использование sweep является основным трюком здесь.

0 голосов
/ 08 ноября 2018
df1[] <- mapply(function(nm, dat) if (nm %in% names(df2) && is.numeric(dat)) dat*df2[[nm]] else dat,
                names(df1), df1, SIMPLIFY=FALSE)
df1
#   Col1 Col2  A  B  C
# 1    A    1  4  9 16
# 2    B    2 10 21 32

df1[] <- ... является эффективным (хотя и не совсем) ярлыком df1 <- as.data.frame(...).

Я как раз собирался предложить intersect, когда пришел ответ Юлиуса ... но я включу его для полноты (поскольку остальная часть этого ответа немного отличается):

df1[intersect(names(df1), names(df2))] <- 
  mapply(function(nm, dat) dat*df2[[nm]],
         intersect(names(df1), names(df2)), df1[intersect(names(df1), names(df2))], SIMPLIFY=FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...