Определить, равна ли строка единице, и вставить значение другого столбца. - PullRequest
0 голосов
/ 15 февраля 2019

Имея в качестве входных данных:

Как можно проверить столбцы stock1 и stock2, если они есть, принимают значение com_num столбец

dframe <- data.frame(
    com = c("col1","em","col1","em"), com_num = c(3.1,2.1,2.1,4.1),
    stock1 = c(1,0,1,1), stock2 = c(1,1,0,1)
)

Вот пример ожидаемого результата

dframe_ex <- data.frame(
    com = c("col1","em","col1","em"), com_num = c(3.1,2.1,2.1,4.1),
    stock1 = c(3.1,0,2.1,4.1), stock2 = c(3.1,2.1,0,4.1)
)

dframe_ex

   com com_num stock1 stock2
1 col1     3.1    3.1    3.1
2   em     2.1    0.0    2.1
3 col1     2.1    2.1    0.0
4   em     4.1    4.1    4.1

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019
cols = c("stock1", "stock2")
dframe[cols] = lapply(X = cols, FUN =  function(nm) dframe[nm]*dframe["com_num"])
dframe
#   com com_num stock1 stock2
#1 col1     3.1    3.1    3.1
#2   em     2.1    0.0    2.1
#3 col1     2.1    2.1    0.0
#4   em     4.1    4.1    4.1
0 голосов
/ 15 февраля 2019

Другая base R опция

dframe[, 3:4] <- dframe[, 3:4] * dframe[, 2] 
dframe
#   com com_num stock1 stock2
#1 col1     3.1    3.1    3.1
#2   em     2.1    0.0    2.1
#3 col1     2.1    2.1    0.0
#4   em     4.1    4.1    4.1 
0 голосов
/ 15 февраля 2019

Мы можем использовать mutate_at из dplyr.

library(dplyr)

dframe %>%
  mutate_at(vars(starts_with("stock")), funs(ifelse(. == 1, com_num, .)))
#    com com_num stock1 stock2
# 1 col1     3.1    3.1    3.1
# 2   em     2.1    0.0    2.1
# 3 col1     2.1    2.1    0.0
# 4   em     4.1    4.1    4.1

или

dframe %>%
  mutate_at(vars(starts_with("stock")), funs(. * com_num))
#    com com_num stock1 stock2
# 1 col1     3.1    3.1    3.1
# 2   em     2.1    0.0    2.1
# 3 col1     2.1    2.1    0.0
# 4   em     4.1    4.1    4.1

Базовое решение R с lapply.

dframe[grepl("^stock", names(dframe))] <- lapply(dframe[grepl("^stock", names(dframe))],
                                                 function(x) x * dframe$com_num)
dframe
#    com com_num stock1 stock2
# 1 col1     3.1    3.1    3.1
# 2   em     2.1    0.0    2.1
# 3 col1     2.1    2.1    0.0
# 4   em     4.1    4.1    4.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...