【问题标题】:Apply a function to every row对每一行应用一个函数
【发布时间】:2018-03-29 11:15:21
【问题描述】:
dat <- data.frame(loc = c(1,2), year = c(1980,2012), id1 = c(5,6), id2 = c(10,12), id3 = c(14,18),id4 = c(10,12))
dat
  loc year id1 id2 id3 id4
1   1 1980   5  10  14  10
2   2 2012   6  12  18  12

对于每一行,我想将id1 与id4 相加,除以100,然后将id1 与id4 相乘。我已经完成了第一部分。如何在一个函数中完成第二部分?

dat$factor <- apply(dat[,3:6], 1, function(x) 100/sum(x))

如何在上面的同一函数中将 id1 除以因子和 id2 除以因子?

【问题讨论】:

  • 这个dat[,3:6]*dat$factor?
  • 有时我开始考虑太多而忽略了简单的解决方案。谢谢

标签: r apply


【解决方案1】:

您也可以使用直接索引(而不是使用apply):

cols <- c("id1", "id2", "id3", "id4");
dat[cols] <- dat[cols] * 100 / rowSums(dat[cols]);
#  loc year      id1      id2      id3      id4
#1   1 1980 12.82051 25.64103 35.89744 25.64103
#2   2 2012 12.50000 25.00000 37.50000 25.00000

【讨论】:

  • 我觉得应该是rowSums而不是sum吧?
  • 你是绝对正确的@Jimbou;谢谢并更正。
【解决方案2】:

这是tidyverse的选项

library(tidyverse)
dat %>% 
   select(matches("id")) %>%
   reduce(`+`)  %>% 
   mutate(dat, new = .) %>%
   mutate_at(vars(matches("id")), funs(100*./new)) %>% 
   select(-new)
#  loc year      id1      id2      id3      id4
#1   1 1980 12.82051 25.64103 35.89744 25.64103
#2   2 2012 12.50000 25.00000 37.50000 25.00000

或gather/spread

dat %>%
   gather(key, val, id1:id4) %>%
   group_by(loc, year) %>%
   mutate(val = 100* val/sum(val)) %>% 
   spread(key, val)
# A tibble: 2 x 6
# Groups: loc, year [2]
#    loc  year   id1   id2   id3   id4
#* <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  1.00  1980  12.8  25.6  35.9  25.6
#2  2.00  2012  12.5  25.0  37.5  25.0

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2021-10-25
    • 1970-01-01
    • 2021-09-23
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多