применить функцию через строки для определенных столбцов - PullRequest
0 голосов
/ 05 июня 2019

У меня есть тиббл, как:

t <- tribble(~name, ~salary, ~weight, 
             "sarah", 90000, 110, 
             "john", 50000, 150,
             "jones", 70000, 160, 
             )

Я хочу разделить salary на 1000, а вес (здесь в фунтах) - на 2,2, используя вектор weights:

weights_ls <- c(1000, 2.2)

Как разделить определенные столбцы (salary и weight) на вектор weights_ls, строка за строкой? Например, by_row, по-видимому, не позволяет указывать конкретные столбцы. Например, я хотел бы получить:

| name | salary | weight |
|------|--------|--------|
| "sarah" | 90 | 50 |
| "john" | 50 | 68.1818 |
| "jones" | 70 | 72.7272 |

Меня не смущает вопрос, создает ли ответ новые столбцы или переопределяет существующие столбцы.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Один из вариантов - скопировать weights_ls, чтобы сделать длины одинаковыми, а затем разделить

t[-1] <- t[-1]/weights_ls[col(t[-1])]
t
# A tibble: 3 x 3
#  name  salary weight
#  <chr>  <dbl>  <dbl>
#1 sarah     90   50.0
#2 john      50   68.2
#3 jones     70   72.7
0 голосов
/ 05 июня 2019

Вам нужно будет транспонировать тиббл, разделить и снова транспонировать

dt[2:3] <- t(t(dt[2:3])/weights_ls)

#  name  salary weight
#  <chr>  <dbl>  <dbl>
#1 sarah     90   50.0
#2 john      50   68.2
#3 jones     70   72.7

Если вам не известны положения столбцов, вы также можете использовать имена столбцов

dt[c('salary', 'weight')] <- t(t(dt[c('salary', 'weight')])/weights_ls)

Или использоватьmapply

dt[2:3] <- mapply(`/`, dt[2:3], weights_ls)

Или, как предложено @markus, преобразовать weights_ls в список и разделить.

dt[2:3] <- dt[2:3]/as.list(weights_ls)

Переименовал тибль в dt, так как t - имя функции,

...