针对特定列跨行应用函数

apply function across rows for specific columns

我有这样的小问题:

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

我希望使用 weights 向量将 salary 除以 1000,并将重量(此处以磅为单位)除以 2.2:

weights_ls <- c(1000, 2.2)

如何逐行除以 weights_ls 向量的特定列(salaryweight)? by_row,例如,似乎不允许您指定特定的列。例如,我想得到:

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

我不关心答案是创建新列还是覆盖现有列。

您需要移调小标题,再分割并移调

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 是函数名称。

一种选择是复制 '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