R 将多个向量分成若干组(知道每组值的范围)用于条形图

R 将多个向量分成若干组(知道每组值的范围)用于条形图,r,R,我的名字是Natasa,我是R的新手。R的能力给我留下了深刻的印象,但不幸的是,我没有时间从头开始学习 我有很多向量11,每个向量有10000个值/数字,所以我将使用更“紧凑”的版本。假设我有4个向量:其中TI=时间,RE=区域1、2或3 TI -> c(10, 20, 30, 40, 50, 100, 150, 200, 300) RE1 -> c(0.25, 0.78, 0.35, 0.37, 4.56, 5.23, 3.75, 8.51, 10.85) RE2 -> c(

我的名字是Natasa,我是R的新手。R的能力给我留下了深刻的印象,但不幸的是,我没有时间从头开始学习

我有很多向量11,每个向量有10000个值/数字,所以我将使用更“紧凑”的版本。假设我有4个向量:其中TI=时间,RE=区域1、2或3

TI -> c(10, 20, 30, 40, 50, 100, 150, 200, 300)
RE1 -> c(0.25, 0.78, 0.35, 0.37, 4.56, 5.23, 3.75, 8.51, 10.85)
RE2 -> c(0.05, 1.54, 0.4, 0.42, 2.53, 1.38, 4.58, 10.54, 25.35)
RE3 -> c(0.02, 0.53, 0.72, 0.28, 7.82, 13.51, 23.54, 2.15)
我想创建“TI”时间序列的组:组1=对应于10、20、30和40的TI,组2=介于50-150和组3=200和300之间,并根据TI组计算每个RE向量的平均值和stdev。每组长度不等,我不知道每组中“变量”的数量,只知道“范围”。我的最终目标是为每组TI和每个RE向量创建一个分组条形图。在x轴上有时间序列的TI组,在y轴上有区域的“值”,其中在每个时间序列中,每个区域都有一个单独的“直方图”

我在互联网上找到了好几页,尝试了好几件事,但都没有成功。 我的想法是:

要使用cbind函数创建“表”,如下所示: 全部->cbindTI、RE1、RE2、RE3 根据TI分组将TI向量划分为组和其他向量。我找到的页面有: 使用拆分功能,如中所示: 或 使用replace函数根据组group1、group2和group3重命名TI的所有不同值,如: 使用聚合函数,如中所示: 或 最后使用条形图函数。 唯一的问题是,我找不到将表拆分为所需组的正确方法,也找不到“简单”的方法来重命名TI Think2的特定值。 如果我的想法是正确的,我想要一张桌子

TI RE1 RE2 RE3
group1 0.25 0.05 0.02
group1 0.78 1.54 0.53
group1 0.35 0.4 0.72
group1 0.37 0.42 0.28
group2 4.56 2.53 7.82
group2 5.23 1.38 13.51
group2 3.75 4.58 23.54
group3 8.51 10.54 2.15
group3 10.85 25.35 0.65
因为我的数据很大,所以我不认为每个值的替换函数是“可负担的”。我的另一个想法是分别计算每组TI和RE的平均值和SD,然后插入一列,其中包含组的期望名称,然后将所有“表”合并在一个表中……但这将非常耗时,不实用。有没有办法在R中“说”将向量TI的10-40之间的所有数字重命名为group1,50-150之间的值重命名为group2等,或者将…之间的数字重命名为一个组等。?如果没有,是否有一种最简单的方法来计算不同向量的特定值范围的平均值和sd?或者所有这些东西都是不需要的,我可以用barplot函数来做,我也试过了…但没有成功


以这样有限的经验,我真的很难弄明白,任何帮助都将不胜感激!!提前感谢您的回复。

如果您希望您的团队按照您的示例进行不均匀的划分,那么以下内容可能会有所帮助,尽管可能会有更巧妙的方法

我已经使用了dplyr包来按组获取摘要,如果您还没有得到它,您需要安装它

data <- data.frame(TI = c(10, 20, 30, 40, 50, 100, 150, 200, 300),
                   RE1 = c(0.25, 0.78, 0.35, 0.37, 4.56, 5.23, 3.75, 8.51, 10.85),
                   RE2 = c(0.05, 1.54, 0.4, 0.42, 2.53, 1.38, 4.58, 10.54, 25.35),
                   RE3 = c(0.02, 0.53, 0.72, 0.28, 7.82, 13.51, 23.54, 2.15, NA))

data$gp <- NA

data$gp[data$TI > 0 & data$TI < 41] <- "g1"
data$gp[data$TI > 41 & data$TI < 151] <- "g2"
data$gp[data$TI > 151] <- "g3"

library(dplyr)

data <- group_by(data, gp)

summarise(data, mean(RE1, na.rm = TRUE), mean(RE2, na.rm = TRUE), mean(RE3, na.rm = TRUE))

summarise(data, sd(RE1, na.rm = TRUE), sd(RE2, na.rm = TRUE), sd(RE3, na.rm = TRUE))

对于在组中选择值,虽然Froom的建议更为可靠,但%in%构造非常方便

a <- c(10, 13, 18, 21, 15, 32)
a %in% 10:20
# [1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE

:=执行内部赋值,可用于将新值重新赋值给旧列或创建新列。基本上与数据$gp相同组范围的模式是什么?对于整个数据集,它们是否在40之后每次间隔100?我不知道这是否有助于TI的生成:t=cseqfrom=0,to=40,by=10,seqfrom=50,to=150,by=50,seqfrom=200,to=300,by=100,那么由于对应的0t没有RE值,我做到了:TI这个解决方案将无法扩展。正如OP所说,共有10000行。非常感谢您的回复,我将在接下来的几个小时内尝试:谢谢!:我也会试试。
library(data.table)
data <- data.table(TI = c(10, 20, 30, 40, 50, 100, 150, 200, 300),
                   RE1 = c(0.25, 0.78, 0.35, 0.37, 4.56, 5.23, 3.75, 8.51, 10.85),
                   RE2 = c(0.05, 1.54, 0.4, 0.42, 2.53, 1.38, 4.58, 10.54, 25.35),
                   RE3 = c(0.02, 0.53, 0.72, 0.28, 7.82, 13.51, 23.54, 2.15, NA))
g1 <- 1:40
g2 <- 41:150
data[TI %in% g1, gp := "group1"]
data[TI %in% g2, gp := "group2"]
data[TI > 150, gp := "group3"]
data
#     TI   RE1   RE2   RE3     gp
# 1:  10  0.25  0.05  0.02 group1
# 2:  20  0.78  1.54  0.53 group1
# 3:  30  0.35  0.40  0.72 group1
# 4:  40  0.37  0.42  0.28 group1
# 5:  50  4.56  2.53  7.82 group2
# 6: 100  5.23  1.38 13.51 group2
# 7: 150  3.75  4.58 23.54 group2
# 8: 200  8.51 10.54  2.15 group3
# 9: 300 10.85 25.35    NA group3
data[, lapply(.SD, mean, na.rm=TRUE), by = gp, .SDcols=c("RE1", "RE2", "RE3")]
#        gp      RE1     RE2      RE3
# 1: group1 0.437500  0.6025  0.38750
# 2: group2 4.513333  2.8300 14.95667
# 3: group3 9.680000 17.9450  2.15000