我希望采用包含NA个值的54列的行平均数,而不必拼写每一列,即,我希望使用:来 Select 我要使用的列:

data1 <- data %>%
  rowwise() %>%
  mutate(m = mean(c(A1:C3), na.rm=T))

然而,当我这样做时,我得到以下错误:

Error in `mutate()`:
i In argument: `m = mean(c(A1:C3), na.rm = T)`.
i In row 2.
Caused by error in `A1:C3`:
! NA/NaN argument

显然,na.rm = T的论点没有被考虑在内?如果我拼写出所有列,即,

data1 <- data %>%
  rowwise() %>%
  mutate(m = mean(c(A1, B1, C1, D1, ...), na.rm=T))

但这非常乏味,如果没有必要,我不想写出54个列名.你有什么办法在tidyverse人的世界里做到这一点吗?下面是它的重述:

data <- structure(list(SampleID = c(5, 6), StationID = c("ROC", "DAK"
), Date = structure(c(1127361600, 1347336000), class = c("POSIXct", 
"POSIXt"), tzone = ""), A1 = c(100, 50), B1 = c(100, 10), C1 = c(100, 
30), D1 = c(100, 10), E1 = c(100, 0), F1 = c(60, 20), G1 = c(60, 
100), H1 = c(0, 10), I1 = c(40, 10), J1 = c(40, 10), K1 = c(100, 
30), L1 = c(40, 20), M1 = c(40, 10), N1 = c(40, 10), O1 = c(100, 
100), P1 = c(100, 0), Q1 = c(80, 10), R1 = c(100, NA), S1 = c(60, 
10), T1 = c(100, 100), U1 = c(70, 10), V1 = c(70, 10), W1 = c(100, 
100), X1 = c(100, 30), Y1 = c(80, 30), Z1 = c(30, 10), A2 = c(20, 
20), B2 = c(60, 100), C2 = c(30, 50), D2 = c(100, 10), E2 = c(20, 
0), F2 = c(30, 0), G2 = c(20, 30), H2 = c(30, 30), I2 = c(100, 
60), J2 = c(0, 10), K2 = c(20, 100), L2 = c(100, 40), M2 = c(100, 
40), N2 = c(100, 100), O2 = c(50, NA), P2 = c(20, NA), Q2 = c(40, 
NA), R2 = c(40, NA), S2 = c(100, NA), T2 = c(30, NA), U2 = c(30, 
NA), V2 = c(100, NA), W2 = c(100, NA), X2 = c(100, NA), Y2 = c(100, 
NA), Z2 = c(50, NA), A3 = c(50, NA), B3 = c(50, NA), C3 = c(100, 
NA)), row.names = 5:6, class = "data.frame")

还要注意,这里的列名是我用c(paste0(LETTERS[1:26], "1"), paste0(LETTERS[1:26], "2"), paste0(LETTERS[1:3], "3")发明的列名,它们不是我的og数据的列名.

推荐答案

你可以用c_across().在c_across()中,您可以使用tidyselect选项,如starts_with():where()

它是这样的:

data %>%
  rowwise() %>%
  mutate(m = mean(c_across(A1:C3))) %>%
  ungroup()

如果您有Nas,则可以在Mean函数中使用na.rm=true,如下所示.

data %>%
  rowwise() %>%
  mutate(m = mean(c_across(A1:C3), na.rm = TRUE)) %>%
  ungroup()

为了获得更好的速度,这只适用于均值和和,有基本的R函数rowMeans()和rowSums(),它允许您避免逐行调用,从而提高了速度.您可以在里面使用pick()函数.

data |>
  mutate(
    m = rowMeans(pick(A1:C3), na.rm = TRUE)
  )

R相关问答推荐

将模拟变量乘以多个观测结果中的模拟变量

在特定列上滞后n行,同时扩展框架的长度

x[[1]]中的错误:脚注越界

无法将传奇添加到cowplot多情节中

向gggplot 2中的数据和轴标签添加大写和星号

通过使用str_detect对具有相似字符串的组进行分组

从R导出全局环境中的所有sf(numrames)对象

如何在ggplot中标记qqplot上的点?

计算时间段的ECDF(R)

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

以相同的方式对每个表进行排序

合并后返回列表的数据帧列表

函数可以跨多个列搜索多个字符串并创建二进制输出变量

汇总数据的Sheffe检验的P值(平均值和标准差)

WRS2包中带有bwtrim的简单ANOVA抛出错误

如何将一个方阵分解成没有循环的立方体

如何筛选截止年份之前最后一个测量年度的所有观测值以及截止年份之后所有年份的所有观测值

R中治疗序列的相对时间指数

SHILINY中DT列的条件着色

如何更改包中函数中的参数?