当前位置: 首页 > 知识库问答 >
问题:

在dplyr中使用mutate()时,如何在不键入所有名称的情况下创建一个新列作为总和或均值或行中的几个单元格?

董哲
2023-03-14

假设表中有120列,最后100列是“week1”、“week2”、…“week 100”。我可以创建一个新列并使其等于100周的平均值吗?

我尝试了<code>mutate(table,mean_value=mean(num_range(“week”,1:100)),但它不起作用。

提前感谢。

共有2个答案

谯志诚
2023-03-14

它不完全适合管道,但如何:

weekdata <- select(table,week1:week100)
table %>% mutate(meanval=rowMeans(weekdata))

?

马欣荣
2023-03-14

我认为有两种方法可以做到这一点。对于这两者,假设您的数据如下所示:

df = data_frame(var1 = rnorm(10), 
            var2 = rnorm(10), 
            othervar1 = rnorm(10), 
            othervar2 = rnorm(10),
            othervar3 = rnorm(10))

并且我们想要计算名称中具有字符串“othervar”的变量的平均值:

to_aggregate = names(df)[grepl("othervar", names(df))]

方法1:NSE

最优雅的解决方案可能是使用非标准评估。首先,我们创建平均值公式:

agg_formula = as.formula(paste0(" ~ mean(c(", paste0(to_aggregate, collapse = ", "), "))"))

这将动态创建平均值的公式:~(other var 1 other var 2 other var 3)/3。然后,我们可以使用dplyr逐行执行,并应用公式:

df %>% 
  mutate(tmp_ID = row_number()) %>% 
  group_by(tmp_ID) %>% 
  mutate_(.dots = setNames(list(agg_formula), 'res')) %>% 
  mutate(check_res = (othervar1 + othervar2 + othervar3) / 3) %>% 
  ungroup()

      var1       var2  othervar1   othervar2   othervar3 tmp_ID         res   check_res
     (dbl)      (dbl)      (dbl)       (dbl)       (dbl)  (int)       (dbl)       (dbl)
1  -0.32615666  0.4713765 -0.3915121 -1.06072106  0.09051817      1 -0.45390498 -0.45390498
2   0.57071669  1.3189079  0.8762870 -2.00557762 -0.44993910      2 -0.52640991 -0.52640991
3   0.24825279 -0.9491394 -2.1563560 -0.01378413 -0.22521368      3 -0.79845126 -0.79845126
4  -1.80198808 -2.2495440 -1.1170833  0.50966421 -0.56381476      4 -0.39041128 -0.39041128 

方法二:熔化

第二种方法不太漂亮(在我看来),它首先融化了数据帧:

library(reshape2)
df %>% 
   mutate(tmp_ID = row_number()) %>% 
   select(tmp_ID, contains("othervar")) %>% 
   melt(id.vars = "tmp_ID") %>% 
   group_by(tmp_ID) %>% 
   summarize(res = mean(value))

tmp_ID         res
(int)       (dbl)
1       1 -0.45390498
2       2 -0.52640991
3       3 -0.79845126
4       4 -0.39041128

如果需要,您可以使用left_join和“tmp_ID”作为键将原始数据连接回。

 类似资料:
  • 我想在一个数据帧中创建几个新的空变量,并在向量中指定变量名。如果我只指定了一个变量名,这是可行的,但如果指定了几个,就不行了。我尝试了一些以前的解决方案,但它们似乎在这种情况下不起作用,例如: < li >不硬编码变量名的dplyr > < li >传递带有要变异的名称的向量以创建多个新列 < li>dplyr - mutate:使用动态变量名 期望的输出将是: 我想知道我如何能使这个工作?

  • 我的问题是如何创建一个新列,它是DPLYR中一些特定列(根据它们的名称选择)的总和。例如,使用iris dataset,我创建了一个名为Petal的新列,它是Petal.Length和Petal.Width的总和。

  • 问题内容: 我想扩大 行高 并显示其中的内容。我在想要的视图中显示我的内容,当我点击一个单元格时,它应该像下图所示那样展开,但无需重新加载UITableview。 到目前为止,我一直在尝试。 1)我尝试在内部扩大视图,但是没有用 2)我尝试添加rowAtIndex变得越来越复杂 3)我尝试更改更改行高并在索引处滚动,效果很好,但我不想那样做。(不好的事情,我必须重新加载表视图) 但是我得到了很多答

  • 我正在使用{dplyr}1.1.0中的的,我想知道当嵌套的data.frame被按行方式分组时,是否可以在不离开管道的情况下对每个中的和列进行和。 为什么我想知道/这么做?根据我对{dplyr}1.1.0的理解,它推荐,而不是在列上使用{purrr}的-family。下面我首先展示了我在{dplyr}1.1.0之前所做的工作,然后展示了几个针对{dplyr}1.1.0的示例(其中大多数不起作用)。

  • 我试图让发送消息给另一方的用户和接收消息的用户在每行的一行中。 那么oracle sql查询应该是什么呢

  • 我有一个返回字符串的函数。 返回的结果可以是回答,也可以是回答