r - dplyr 在列范围内发生变异
问题描述
我想对数据框上的一系列列进行操作。假设这个数据集是:
set.seed(15)
df <- data.frame(id=letters[1:10], matrix(runif(5*10), nrow=5)) %>% dplyr::rename(O6 = X7)
我认为我想要实现的目标很明显:
df %>% rowwise() %>% mutate(minval_X3_X8 = min(X3:X8))
即得到以下结果:
df %>% rowwise() %>% mutate(minval_X3_X8 = min(X3, X4, X5, O6, X7, X8))
我对 X3:X8 的初始尝试没有给出任何错误消息,所以我想知道:
1. 使用 dplyr 实现所需输出的最佳方法是什么(我从 X3 列中获得最小/最大/平均值等值到 X8)
2. 使用 X3:X8 时我实际上得到了什么
非常感谢 !
附言。如果解决方案包括这样做的可能性,那就太好了:
df %>% rowwise() %>% mutate(minval_all_but_ex_rownames = min(-id))
解决方案
dplyr::select
可以使用 的范围符号X3:X7
,但不能使用其他函数。如果你可以在外面工作mutate
,试试这个:
df$minval_X3_X8 <- do.call(pmin, select(df, X3:X8))
df
# id X1 X2 X3 X4 X5 O6 X7 X8 X9 X10 minval_X3_X8
# 1 a 0.6021140 0.9888592 0.1046694 0.8417851 0.80372740 0.6590069 0.4985587 0.6578783 0.9152619 0.4291725 0.10466936
# 2 b 0.1950439 0.8151934 0.6461509 0.4474437 0.79334595 0.1069735 0.2567427 0.1215491 0.4574306 0.3302786 0.10697354
# 3 c 0.9664587 0.2539684 0.5090904 0.9646670 0.35756312 0.1483839 0.4916694 0.5159349 0.9210739 0.7528325 0.14838386
# 4 d 0.6509055 0.6872308 0.7066286 0.1411871 0.05800106 0.9277570 0.1174759 0.3016811 0.2591188 0.8438981 0.05800106
# 5 e 0.3670719 0.8314290 0.8623137 0.7767125 0.56574614 0.4763697 0.5128062 0.7603278 0.3437781 0.0108724 0.47636970
# 6 f 0.6021140 0.9888592 0.1046694 0.8417851 0.80372740 0.6590069 0.4985587 0.6578783 0.9152619 0.4291725 0.10466936
# 7 g 0.1950439 0.8151934 0.6461509 0.4474437 0.79334595 0.1069735 0.2567427 0.1215491 0.4574306 0.3302786 0.10697354
# 8 h 0.9664587 0.2539684 0.5090904 0.9646670 0.35756312 0.1483839 0.4916694 0.5159349 0.9210739 0.7528325 0.14838386
# 9 i 0.6509055 0.6872308 0.7066286 0.1411871 0.05800106 0.9277570 0.1174759 0.3016811 0.2591188 0.8438981 0.05800106
# 10 j 0.3670719 0.8314290 0.8623137 0.7767125 0.56574614 0.4763697 0.5128062 0.7603278 0.3437781 0.0108724 0.47636970
编辑:正如@Moody_Mudskipper 所建议的,这可以包含在mutate
:
df %>% mutate(minval_X3_X8 = do.call(pmin, select(., X3:X8)))
# same output as above
但这应该谨慎使用,因为它的使用不尊重group
数据。我会定期使用下一个方法来查看我的函数在(可选group
)内部调用时“看到”的内容mutate
。这里的mymin
函数没有任何用处,只是提供了一个中间mutate
浏览:
mymin <- function(...) { browser(); 1; }
这个例子:
df %>% rowwise() %>% mutate(minval_X3_X8 = do.call(mymin, select(., X3:X8)))
# Called from: (function (...)
# {
# browser()
# 1
# }) ...snip...
# Browse[1]>
# debug at #1: [1] 1
# Browse[2]>
如果我们查看函数的参数,我们会看到它提供了什么:
list(...)
# $X3
# [1] 0.1046694 0.6461509 0.5090904 0.7066286 0.8623137 0.1046694 0.6461509 0.5090904 0.7066286
# [10] 0.8623137
# $X4
# [1] 0.8417851 0.4474437 0.9646670 0.1411871 0.7767125 0.8417851 0.4474437 0.9646670 0.1411871
# [10] 0.7767125
# $X5
# [1] 0.80372740 0.79334595 0.35756312 0.05800106 0.56574614 0.80372740 0.79334595 0.35756312
# [9] 0.05800106 0.56574614
# $O6
# [1] 0.6590069 0.1069735 0.1483839 0.9277570 0.4763697 0.6590069 0.1069735 0.1483839 0.9277570
# [10] 0.4763697
# $X7
# [1] 0.4985587 0.2567427 0.4916694 0.1174759 0.5128062 0.4985587 0.2567427 0.4916694 0.1174759
# [10] 0.5128062
# $X8
# [1] 0.6578783 0.1215491 0.5159349 0.3016811 0.7603278 0.6578783 0.1215491 0.5159349 0.3016811
# [10] 0.7603278
如果这对rowwise
分组表示敬意,我本来希望看到这样的东西,只代表一行数据:
lapply(list(...), `[`, 1)
# $X3
# [1] 0.1046694
# $X4
# [1] 0.8417851
# $X5
# [1] 0.8037274
# $O6
# [1] 0.6590069
# $X7
# [1] 0.4985587
# $X8
# [1] 0.6578783
推荐阅读
- google-sheets - 谷歌电子表格,从行到列
- python - 如何导航到 Jupyter Lab 中的不同目录?
- r-markdown - Blogdown + Hugo 没有在 netlify 上显示 Rmarkdown 图
- html - 兼容性问题
- python-3.x - 无法使用 vscode 在 docker 中运行 python flask 应用程序(来自教程)
- git - 是否可以计算特定提交的父母数量?
- javascript - 图片无法在 header.ejs 文件中显示
- c++ - 插入和删除哪种数据结构更快
- python - 使用 Tweepy 时出现 TweepError 属性错误
- eclipse-plugin - 如何将插件放在第三方插件的类路径中?