dplyr:在汇总中为向量中的每个变量名称添加新变量。

9 浏览
0 Comments

dplyr:在汇总中为向量中的每个变量名称添加新变量。

我有这段代码:

trimmedMeans <- cleaned %>%
    filter(TrackName == t & ToBeTrimmed != 1) %>%
    group_by(TrackName, SpeakerName) %>%
    summarise(Expectation.Mean = mean(Expectation, na.rm = TRUE),
              Expectation.Sd = sd(Expectation, na.rm = TRUE),
              Interesting.Mean = mean(Interesting, na.rm = TRUE),
              Interesting.Sd = sd(Interesting, na.rm = TRUE),
              Useful.Mean = mean(Useful, na.rm = TRUE),
              Useful.Sd = sd(Useful, na.rm = TRUE),
              OralPresentation.Mean = mean(OralPresentation, na.rm = TRUE),
              OralPresentation.Sd = sd(OralPresentation, na.rm = TRUE),
              NumOfVoters = n()
    )

现在假设有这个向量:

myvars <- c("Expectation", "Interesting", "Useful", "OralPresentation")

我希望使用向量myvars动态地推广之前的代码块。

0
0 Comments

问题的出现原因是需要在dplyr中的summarise函数中,为每个变量名添加新的变量。解决方法是使用summarise_at函数,并将要添加的变量名放入一个向量中。具体代码如下:

iris %>%
  group_by(Species) %>%
  summarise_at(c("Sepal.Length", "Sepal.Width"), funs(mean, sd), na.rm=TRUE)

这段代码将按照Species进行分组,然后对Sepal.Length和Sepal.Width两个变量进行求均值和标准差的计算。输出结果是一个包含新变量的数据框。

在上述示例中,还存在"NumOfVoters = n()"的情况。是否有一种快速的方法可以在同一语句中添加这个聚合变量呢?

解决方法是使用add_tally函数和summarise_at函数的组合。具体代码如下:

trimmedMeans <- cleaned %>%
  filter(TrackName == t & ToBeTrimmed != 1) %>%
  group_by(TrackName, SpeakerName) %>%
  add_tally() %>%
  group_by(TrackName, SpeakerName, n, add = FALSE) %>%
  summarise_at(.vars = speaker.characteristcs, funs(mean, sd), na.rm=TRUE)

这段代码首先根据条件进行筛选,然后按照TrackName和SpeakerName进行分组,并使用add_tally函数添加NumOfVoters变量。接着再次按照TrackName、SpeakerName和n进行分组,并使用summarise_at函数对speaker.characteristcs变量进行求均值和标准差的计算。最终得到含有新变量的数据框trimmedMeans。

0