在使用plyrI 时,我经常发现使用adply标量函数很有用,我必须将其应用于每一行.
例如
data(iris)
library(plyr)
head(
adply(iris, 1, transform , Max.Len= max(Sepal.Length,Petal.Length))
)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len
1 5.1 3.5 1.4 0.2 setosa 5.1
2 4.9 3.0 1.4 0.2 setosa 4.9
3 4.7 3.2 1.3 0.2 setosa 4.7
4 4.6 3.1 1.5 0.2 setosa 4.6
5 5.0 3.6 1.4 0.2 setosa 5.0
6 5.4 3.9 1.7 0.4 setosa 5.4
Run Code Online (Sandbox Code Playgroud)
现在我正在使用dplyr更多,我想知道是否有一个整洁/自然的方式来做到这一点?因为这不是我想要的:
library(dplyr)
head(
mutate(iris, Max.Len= max(Sepal.Length,Petal.Length))
)
Sepal.Length Sepal.Width Petal.Length Petal.Width …Run Code Online (Sandbox Code Playgroud) 我有一个带有一些NA值的数据框.我需要两列的总和.如果值为NA,我需要将其视为零.
a b c d
1 2 3 4
5 NA 7 8
Run Code Online (Sandbox Code Playgroud)
列e应该是b和c的总和:
e
5
7
Run Code Online (Sandbox Code Playgroud)
我尝试过很多东西,并且没有运气就完成了二十几次搜索.这似乎是一个简单的问题.任何帮助,将不胜感激!
我有以下格式的数据:
gen = function () sample.int(10, replace = TRUE)
x = data.frame(A = gen(), C = gen(), G = gen(), T = gen())
Run Code Online (Sandbox Code Playgroud)
我现在想要在每行中附加行中所有元素的总和(我的实际函数更复杂,但sum说明了问题).
没有dplyr,我会写
cbind(x, Sum = apply(x, 1, sum))
Run Code Online (Sandbox Code Playgroud)
导致:
A C G T Sum
1 3 1 6 9 19
2 3 4 3 3 13
3 3 1 10 5 19
4 7 2 1 6 16
…
Run Code Online (Sandbox Code Playgroud)
但用dplyr做这件事似乎很难.
我试过了
x %>% rowwise() %>% mutate(Sum = sum(A : T))
Run Code Online (Sandbox Code Playgroud)
但结果不是每一行的总和,这是意想不到的东西,(对我来说)莫名其妙.
我也试过了
x %>% rowwise() …Run Code Online (Sandbox Code Playgroud) 我正在对多列求和,有些列有 NA。我在用
dplyr::mutate
Run Code Online (Sandbox Code Playgroud)
然后写出列的算术和以获得总和。但是列有 NA,我想将它们视为零。我能够让它与 rowSums 一起工作(见下文),但现在使用 mutate。使用 mutate 可以使其更具可读性,但也可以让我减去列。示例如下。
require(dplyr)
data(iris)
iris <- tbl_df(iris)
iris[2,3] <- NA
iris <- mutate(iris, sum = Sepal.Length + Petal.Length)
Run Code Online (Sandbox Code Playgroud)
如何确保 Petal.Length 中的 NA 在上述表达式中被处理为零?我知道使用 rowSums 我可以执行以下操作:
iris$sum <- rowSums(DF[,c("Sepal.Length","Petal.Length")], na.rm = T)
Run Code Online (Sandbox Code Playgroud)
但是使用 mutate 甚至可以更容易地设置 diff = Sepal.Length - Petal.Length。使用 mutate 完成此操作的建议方法是什么?
请注意,该帖子类似于以下 stackoverflow 帖子。
我的问题是如何创建一个新列,它是dplyr中某些特定列(由其名称选择)的总和.例如,使用iris数据集,我创建一个名为Petal的新列,它是Petal.Length和Petal.Width的总和.
iris %>% mutate(Petal = Petal.Length+Petal.Width)
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个20列的数据集,其名称中包含'Petal'.我想创建一个"Petal"列,它总结了所有这些列.我绝对不想在我的代码中键入所有列名称.感觉在dplyr中应该有一行代码可以实现.感谢是否有人可以提供帮助.
如果我想在数据框中使用一些变量求和dplyr,我可以这样做:
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> select(iris, starts_with('Petal')) %>% rowSums()
[1] 1.6 1.6 1.5 1.7 1.6 2.1 1.7 1.7 1.6 1.6 1.7 1.8 1.5 1.2 1.4 1.9 1.7 1.7 2.0 1.8 1.9 1.9 1.2 2.2 2.1 1.8 2.0 1.7 …Run Code Online (Sandbox Code Playgroud) 本着在这里和这里的类似思路,我希望能够对我的data_frame&列中的一系列列求和,并创建一个新列:
df_abc = data_frame(
FJDFjdfF = seq(1:100),
FfdfFxfj = seq(1:100),
orfOiRFj = seq(1:100),
xDGHdj = seq(1:100),
jfdIDFF = seq(1:100),
DJHhhjhF = seq(1:100),
KhjhjFlFLF = seq(1:100),
IgiGJIJFG= seq(1:100),
)
# this does what I want
df_abc %>%
mutate(
sum_1 = orfOiRFj + xDGHdj + jfdIDFF + DJHhhjhF
)
Run Code Online (Sandbox Code Playgroud)
显然,如果此顺序中有很多变量,则将它们键入出来是不可行的。另外,变量的名称不是正则表达式友好的,因此不能按规则选择,除非它们按顺序出现。
我希望在tidyverse中存在一个抽象,该抽象允许以下内容:
df_abc %>%
mutate(
sum_1 = sum(orfOiRFj:DJHhhjhF)
)
Run Code Online (Sandbox Code Playgroud)
谢谢。
我有一个类似的数据框mtcars,以及一个列名称的字符串向量c("mpg", "cyl", "disp", "hp", "drat"),我希望将所有列加在一起成为一个新的列.
我通常会使用类似的东西
mtcars %>% transmute(new_col = mpg + cyl + disp + hp + drat)
new_col
1 300.90
2 300.90
3 231.65
4 398.48
5 564.85
6 356.86
7 630.51
Run Code Online (Sandbox Code Playgroud)
但是,如果您有一个存储在向量中的100个列名,这将变得非常繁琐.
所以我的问题是,有没有一种方法可以将许多列汇总在一起,列名称保存在字符串向量中?
让我们来说明着名iris数据集上的问题.我需要按行应用所选函数,但仅适用于所选列.示例如下:
library(tidyverse)
iris %>%
mutate_at(.funs = scale, .vars = vars(-c(Species))) %>%
rowwise() %>%
mutate(my_mean=mean(c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)))
Run Code Online (Sandbox Code Playgroud)
因此,首先我缩放所有变量,排除Species然后在所有四个数值变量上计算平均行数.但是,在真实数据集中,我有100多个数字变量,我想知道如何说服R自动包含除了所选变量之外的所有变量(例如,Species在给定的例子中).我在SO上讨论解决方案(例如,这个),但所有示例都明确引用了列名.任何指针都非常受欢迎.
编辑:经过一些改变,这是我的解决方案:
iris %>%
as_tibble() %>%
mutate_at(.funs = scale, .vars = vars(-c(Species))) %>%
transmute(Species, row_mean = rowMeans(select(., -Species)))
Run Code Online (Sandbox Code Playgroud) 我想在我的数据框架中创建一个列,在那里我可以将数据帧的另外两列相加.
df <- data.frame(x = 1:10, y = 11:20)
Run Code Online (Sandbox Code Playgroud)
在这里,例如,我想添加第三列z,我有:
z <- c(12, 14, 16,..., 30)
Run Code Online (Sandbox Code Playgroud)
提前致谢.