R数据操作
R-data Manupulation
我有一个包含 176 个植物种群的数据集,重复 3 次(R1、R2、R3)。我制作了一个表格(如下)。现在我想取每个人的 R1、R2 和 R3 的平均值,并将该值写入我的 .CSV 数据文件的新列中。我可以在 R 中做到吗?
请帮忙。
##demo file
| geno | trait1 | trait2 | trait3 | trait4 |
|------ |-------- |-------- |-------- |-------- |
| 1_R1 | 1.891 | 2.561 | 0.9 | 11 |
| 1_R2 | 10.341 | 2.121 | 0.6 | 2 |
| 1_R3 | 9.451 | 6.781 | 4.56 | 7 |
| 2_R1 | 11.09 | 9.191 | | 8 |
在 dplyr
中更容易做到这一点。假设"geno"列同时有"id"和"geno"信息,我们需要先拆分"geno"列。使用 separate
执行此操作,然后使用 mutate_each
获取每个 trait
列的平均值。 mutate_each
到 select 列名中有一个选项。我们可以使用 starts_with
、end_with
、contains
、matches
等...这里,我指定不被 -
使用的列。之后,unite
列 "geno1" 和 "id" 到单个列 "geno",left_join
与原始 df
.
library(dplyr)
library(tidyr)
df1 <- df %>%
separate(geno, c('id', 'geno1'))%>%
group_by(id)%>%
mutate_each(funs(mean=mean(., na.rm=TRUE)),-geno1) %>%
unite(geno, id, geno1)
colnames(df1)[-1] <- paste(colnames(df1)[-1], 'mean', sep="_")
left_join(df, df1, by='geno')
# geno trait1 trait2 trait3 trait4 trait1_mean trait2_mean trait3_mean
#1 1_R1 1.891 2.561 0.90 11 7.227667 3.821 2.02
#2 1_R2 10.341 2.121 0.60 2 7.227667 3.821 2.02
#3 1_R3 9.451 6.781 4.56 7 7.227667 3.821 2.02
#4 2_R1 11.090 9.191 NA 8 11.090000 9.191 NaN
# trait4_mean
#1 6.666667
#2 6.666667
#3 6.666667
#4 8.000000
或者 data.table
相对更容易。使用 setDT
将 data.frame
转换为 data.table
。通过将 (:=
) 分配给每列的平均值来创建新列 nm1
。我们使用 lapply(..)
来获取 .SDcols
中指定列的平均值。
library(data.table)
nm1 <- paste(colnames(df)[-1], 'mean', sep="_")
setDT(df)[, (nm1):= lapply(.SD, mean, na.rm=TRUE),
list(id=sub('_.*', '', geno)),.SDcols=2:5]
或者如果您只需要 "id" 中每个 "column" 的 "mean summary",您可以在 base R
中完成。确保指定 na.action=na.pass
否则 "default" 设置将删除整行,从而导致不同的输出。
df$id <- sub('_.*', '', df$geno)
aggregate(.~id, df[-1], FUN=mean, na.action=na.pass)
# id trait1 trait2 trait3 trait4
#1 1 7.227667 3.821 2.02 6.666667
#2 2 11.090000 9.191 NA 8.000000
数据
df <- structure(list(geno = c("1_R1", "1_R2", "1_R3", "2_R1"),
trait1 = c(1.891, 10.341, 9.451, 11.09), trait2 = c(2.561, 2.121, 6.781,
9.191), trait3 = c(0.9, 0.6, 4.56, NA), trait4 = c(11L, 2L, 7L, 8L
)), .Names = c("geno", "trait1", "trait2", "trait3", "trait4"
), class = "data.frame", row.names = c(NA, -4L))
我有一个包含 176 个植物种群的数据集,重复 3 次(R1、R2、R3)。我制作了一个表格(如下)。现在我想取每个人的 R1、R2 和 R3 的平均值,并将该值写入我的 .CSV 数据文件的新列中。我可以在 R 中做到吗? 请帮忙。
##demo file
| geno | trait1 | trait2 | trait3 | trait4 |
|------ |-------- |-------- |-------- |-------- |
| 1_R1 | 1.891 | 2.561 | 0.9 | 11 |
| 1_R2 | 10.341 | 2.121 | 0.6 | 2 |
| 1_R3 | 9.451 | 6.781 | 4.56 | 7 |
| 2_R1 | 11.09 | 9.191 | | 8 |
在 dplyr
中更容易做到这一点。假设"geno"列同时有"id"和"geno"信息,我们需要先拆分"geno"列。使用 separate
执行此操作,然后使用 mutate_each
获取每个 trait
列的平均值。 mutate_each
到 select 列名中有一个选项。我们可以使用 starts_with
、end_with
、contains
、matches
等...这里,我指定不被 -
使用的列。之后,unite
列 "geno1" 和 "id" 到单个列 "geno",left_join
与原始 df
.
library(dplyr)
library(tidyr)
df1 <- df %>%
separate(geno, c('id', 'geno1'))%>%
group_by(id)%>%
mutate_each(funs(mean=mean(., na.rm=TRUE)),-geno1) %>%
unite(geno, id, geno1)
colnames(df1)[-1] <- paste(colnames(df1)[-1], 'mean', sep="_")
left_join(df, df1, by='geno')
# geno trait1 trait2 trait3 trait4 trait1_mean trait2_mean trait3_mean
#1 1_R1 1.891 2.561 0.90 11 7.227667 3.821 2.02
#2 1_R2 10.341 2.121 0.60 2 7.227667 3.821 2.02
#3 1_R3 9.451 6.781 4.56 7 7.227667 3.821 2.02
#4 2_R1 11.090 9.191 NA 8 11.090000 9.191 NaN
# trait4_mean
#1 6.666667
#2 6.666667
#3 6.666667
#4 8.000000
或者 data.table
相对更容易。使用 setDT
将 data.frame
转换为 data.table
。通过将 (:=
) 分配给每列的平均值来创建新列 nm1
。我们使用 lapply(..)
来获取 .SDcols
中指定列的平均值。
library(data.table)
nm1 <- paste(colnames(df)[-1], 'mean', sep="_")
setDT(df)[, (nm1):= lapply(.SD, mean, na.rm=TRUE),
list(id=sub('_.*', '', geno)),.SDcols=2:5]
或者如果您只需要 "id" 中每个 "column" 的 "mean summary",您可以在 base R
中完成。确保指定 na.action=na.pass
否则 "default" 设置将删除整行,从而导致不同的输出。
df$id <- sub('_.*', '', df$geno)
aggregate(.~id, df[-1], FUN=mean, na.action=na.pass)
# id trait1 trait2 trait3 trait4
#1 1 7.227667 3.821 2.02 6.666667
#2 2 11.090000 9.191 NA 8.000000
数据
df <- structure(list(geno = c("1_R1", "1_R2", "1_R3", "2_R1"),
trait1 = c(1.891, 10.341, 9.451, 11.09), trait2 = c(2.561, 2.121, 6.781,
9.191), trait3 = c(0.9, 0.6, 4.56, NA), trait4 = c(11L, 2L, 7L, 8L
)), .Names = c("geno", "trait1", "trait2", "trait3", "trait4"
), class = "data.frame", row.names = c(NA, -4L))