首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用R中的多个其他变量创建变量

使用R中的多个其他变量创建变量
EN

Stack Overflow用户
提问于 2018-02-10 02:48:36
回答 1查看 1.2K关注 0票数 1

如何有效地组合多列的方法?我希望创建一个对象,该对象具有以A开头的变量的方法列表,而另一个对象具有以C开头的变量的方法列表。理想情况下,我能够使用列号而不是变量名,因为列号更容易键入。

代码语言:javascript
运行
复制
A1U_sweet  A2F_dip  A3U_bbq  C1U_sweet  C2F_dip  C3U_bbq
1          2        1        NA         NA       NA
NA         NA       NA       4          1        2
2          4        7        NA         NA       NA

我以前使用过以下功能,但效率很低。我有比这里描述的更多的列。我包括这个是为了澄清我想要做什么。

代码语言:javascript
运行
复制
average_A<-data.frame((mean(A1U_sweet, na.rm = TRUE)), (mean(A2F_dip, na.rm = TRUE)), (mean(A3U_bbq, na.rm = TRUE)))
average_C<-data.frame((mean(C1U_sweet, na.rm = TRUE)), (mean(C2F_dip, na.rm = TRUE)), (mean(C3U_bbq, na.rm = TRUE)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-10 02:52:16

我们可以通过使用列名的第一个字符来split数据,然后使用base R对每个list元素执行colMeans,并将输出保存在list中。

代码语言:javascript
运行
复制
lst <- lapply(split.default(df1, sub("\\d+.*", "", names(df1))), colMeans, na.rm = TRUE)
lst
#$A
#  A1U_sweet   A2F_dip   A3U_bbq 
#      1.5       3.0       4.0 

#$C
#  C1U_sweet   C2F_dip   C3U_bbq 
#      4         1         2 

或使用substr,并在去掉列名的前缀部分后将其保存在单个数据集中。

代码语言:javascript
运行
复制
res <- t(sapply(split.default(df1, substr(names(df1), 1, 1)), colMeans, na.rm = TRUE))
colnames(res) <- sub("^..", "", colnames(res))
res
#    U_sweet   F_dip   U_bbq
#A       1.5       3       4 
#C       4.0       1       2

或者另一种选择是使用tidyverse,在这里我们将数据转换为'long‘格式,然后按组获取mean

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
   gather(group, value) %>% 
   group_by(grp = str_sub(group, 1, 1), group)  %>% 
   summarise(value = mean(value, na.rm = TRUE)) %>%
   ungroup %>%
   select(-grp)
# A tibble: 6 x 2
#   group     value
#   <chr>     <dbl>
#1 A1U_sweet  1.50
#2 A2F_dip    3.00
#3 A3U_bbq    4.00
#4 C1U_sweet  4.00
#5 C2F_dip    1.00
#6 C3U_bbq    2.00

数据

代码语言:javascript
运行
复制
df1 <- structure(list(A1U_sweet = c(1L, NA, 2L), A2F_dip = c(2L, NA, 
4L), A3U_bbq = c(1L, NA, 7L), C1U_sweet = c(NA, 4L, NA), C2F_dip = c(NA, 
1L, NA), C3U_bbq = c(NA, 2L, NA)), .Names = c("A1U_sweet", "A2F_dip", 
 "A3U_bbq", "C1U_sweet", "C2F_dip", "C3U_bbq"), class = "data.frame", 
 row.names = c(NA, -3L))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48716744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档