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_withend_withcontainsmatches 等...这里,我指定不被 - 使用的列。之后,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 相对更容易。使用 setDTdata.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))