我的名字是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”组(时间序列:group1 = TI对应10,20,30和40,group2 = 50-150和group3 = 200和300)并计算每个组的均值和stdev RE矢量根据/取决于TI的组。每组的长度不等,我不知道每组中“变量”的数量(只有“范围”)。我的最终目标是为每组TI和每个RE矢量创建一个分组条形图。在x轴上,将有TI的组(时间序列)和y轴的“值”区域,其中在每个时间序列中,每个区域将有一个单独的“直方图”。
我在互联网上找到了几页,我尝试了几件事,但没有任何成功。 我的想法是: 1)创建一个“表”(使用cbind函数),如下所示: 全部 - > cbind(TI,RE1,RE2,RE3) 2)根据TI分组将TI矢量分成组和其他矢量。我找到的页面是: 使用split函数,如: How to partition a vector into groups of neighbors in R? Split a vector into three vectors of unequal length in R 要么 使用replace函数根据组(group1,group2和group3)重命名TI的所有不同值,如: Replace given value in vector 3)使用聚合函数,如: Mean per group in a data.frame 要么 R: how can I create a table with mean and sd according to experimental group alongside p-values? 4)最后使用barplot函数。
唯一的问题是我找不到正确的方法将表拆分到所需的组中,或者以“简单”的方式重命名TI的特定值(思想2)。 通缉表(如果我的“想法”是正确的)
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中“说”重命名10-40到group1之间的所有数字,矢量TI的50-150到group2等之间的值,或者......之间的数字是一组等等?如果没有,是否有最简单的方法来计算不同向量的特定值范围的均值和sd?或者所有这些都不需要,我可以使用barplot功能(我也试过这样做......没有任何成功)?
我很难用如此有限的经验弄明白,任何帮助都将不胜感激!在此先感谢您的回复。
答案 0 :(得分:0)
如果您希望您的群体不均匀分割(如您的示例所示),那么以下内容可能会有所帮助,尽管可能有一种更为灵活的方式...
我已经使用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))
答案 1 :(得分:0)
为了挑选组中的值,%in%
构造很方便,尽管Froom对<
和>
的建议更加健全。
a <- c(10, 13, 18, 21, 15, 32)
a %in% 10:20
# [1] TRUE TRUE TRUE FALSE TRUE FALSE
为了总结并通常使用数据,我会查看data.table
包。
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$gp <- ...
相同。另外,正如您可能已经注意到的那样,data.table
的一个很好的特性是它们隐式使用with
语法;即它知道你在谈论它的列,而不是每次都指定data$...
。
然后,总结非常简单。
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
这种语法有点奇怪,但这里有要点:lapply(l, FUN, ...)
采用列表或向量(l
)并将函数(FUN
)应用于{{1}的每个值} {},l
作为...
的附加参数。在这里,FUN
指的是您当前所在的.SD
(data.table
),所以在单词中,整个块都在说“使用参数data
”mean
我正在研究na.rm=TRUE
的每一列“)。 data.table
允许您根据组进行子集化(在本例中为by
列)。最后,gp
按名称指示要在.SDcols
中使用哪些列。忽略这一点会导致.SD
引用整个.SD
,因为列data.table
是一个“字符”向量(而gp
列的平均值是我认为,对你的目的毫无意义。)