在这篇博文中,保罗·希姆斯特拉展示了如何使用 dplyr::mutate_
来总结两列。复制/粘贴相关部件:
library(lazyeval)
f = function(col1, col2, new_col_name) {
mutate_call = lazyeval::interp(~ a + b, a = as.name(col1), b = as.name(col2))
mtcars %>% mutate_(.dots = setNames(list(mutate_call), new_col_name))
}
允许一个人做:
head(f('wt', 'mpg', 'hahaaa'))
太好了!
我接着问了一个问题(见评论),如何将其扩展到100列,因为(对我来说)不太清楚如何在不使用上述方法键入所有名称的情况下做到这一点。保罗很友好地纵容了我,并提供了这个答案(谢谢!):
# data
df = data.frame(matrix(1:100, 10, 10))
names(df) = LETTERS[1:10]
# answer
sum_all_rows = function(list_of_cols) {
summarise_calls = sapply(list_of_cols, function(col) {
lazyeval::interp(~col_name, col_name = as.name(col))
})
df %>% select_(.dots = summarise_calls) %>% mutate(ans1 = rowSums(.))
}
sum_all_rows(LETTERS[sample(1:10, 5)])
我想在以下几点上改进这个答案:
>
其他栏目都没有了,我想留下它们。
它使用<code>rowSums()
另外,我不确定是否鼓励在非 do()
动词中使用 .
因为突变()
中的 .
在与 group_by()
一起使用时似乎并不仅仅适应这些行。
最重要的是,如何使用<code>mutate_()
我找到了这个答案,它解决了第1点,但不幸的是,dplyr
答案都使用了rowSums()
,以及mutate()。
PS:我刚刚阅读了Hadley在那个答案下的评论。IIUC,“通过总和重塑到宽形式的重塑到长形式组”是这些类型操作的推荐
dplyr
方法吗?
这里有一个不同的方法:
library(dplyr); library(lazyeval)
f <- function(df, list_of_cols, new_col) {
df %>%
mutate_(.dots = ~Reduce(`+`, .[list_of_cols])) %>%
setNames(c(names(df), new_col))
}
head(f(mtcars, c("mpg", "cyl"), "x"))
# mpg cyl disp hp drat wt qsec vs am gear carb x
#1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 27.0
#2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 27.0
#3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 26.8
#4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 27.4
#5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 26.7
#6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 24.1
关于您的观点:
行和
group_by
在使用时会有什么危害
内部mutate
/mutate_
它使用<code>mutate_
我有一个包含许多列的数据框架,其中四列代表子类别。 我想用一列替换所有这些“page_x”列,仅显示最右边的非 NA 级别的详细信息。有很多行式问题,但我找不到一个与NSE和Reding一起工作的问题。 在上述示例中,这将是: 我认为在每一行中使用Reduce是一个很好的例子。我有一个版本可以在一行上进行这种工作,但我无法找到一种方法将其应用于mutate_。 这不起作用(因为我猜“行”对象实际上
问题内容: 请帮我这个: 我想按列TestType分组,但如果它们具有相同的TestType,则应将Result拆分为colunms 我希望SQL以这种格式返回数据 Result#列应该是动态的,因为每个TestType都有很多结果 问题答案: 正如我在评论中所提到的,这里您需要的是或交叉标签;我更喜欢后者,所以我将要使用的东西。 对此的非动态解决方案如下: 但是,问题在于这会将您“锁定”到3个结
问题内容: 建立库存系统。我有很多产品,每个产品都有三个不同的变量。因此,对于总库存,我想按两列(产品和尺寸)和总数量分组以获得总库存。 我想要输出的内容: 小部件一-2:375 小部件二-3:150 小部件二-2:150 我想出了如何使用以下代码将一列分组并求和: 我只是按两列分组。可能吗?还是应该仅针对这三种尺寸的商品创建三种不同的产品并删除该列?谢谢。 问题答案: 根据示例表,您似乎希望分组
我有一个像 我有一个用户对象列表,比如:示例数据 我的问题是,如何将此列表分组以了解品牌id出现在哪些对象中,例如品牌id=10出现在所有三个对象中,品牌id=30仅出现在一个对象中 带有 key=brand id 和 value = count 的地图的结果将解决我的问题,如下所示:{10:3},{20:1},{30,1},{50,1},{80,1 }
问题内容: 带有以下数据 我想产生以下输出: 如果我按价格分组并显示最大日期和最小日期,那么我将得到以下不是我想要的内容(请参见重叠的日期)。 因此,基本上我想做的是根据组列产品和价格对数据进行逐步更改。 什么是最干净的方法来做到这一点? 问题答案: 有一种(或多或少)解决此类问题的已知技术,涉及两个调用,如下所示: 输出:
我有一个这样的数据框: 看起来像这样: 我的目标是对列和中具有相同值的行进行分组,并以如下方式合并列的内容: 如您所见,列和中具有相同项的行将被合并,而如果至少有一行不同,它们将保持原样。我的想法是使用和函数,如下所示: 但是Python返回错误消息: 你能告诉我我的代码有什么问题吗?为了实现我的目标,我应该写些什么? 注意:我不关心可以丢弃的列会发生什么。