R 如何创建一个函数来分离和平均这些数据行
我是R新手,有一个大数据框,我想用它在列名中用一个字母分隔数据,然后在末尾附加一个列,其中包含行的平均值。数据如下:R 如何创建一个函数来分离和平均这些数据行,r,function,split,average,R,Function,Split,Average,我是R新手,有一个大数据框,我想用它在列名中用一个字母分隔数据,然后在末尾附加一个列,其中包含行的平均值。数据如下: V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 1 gene_id gene_symbol Chr Biotype L001P L003P L004P L005P L0
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 gene_id gene_symbol Chr Biotype L001P L003P L004P L005P L008P
2 ENSG00000000003 TSPAN6 X protein_coding 31.8003 67.3098 63.033 63.83 38.6941
3 ENSG00000000005 TNMD X protein_coding 0.0372353 2.28841 0.032932 0 0.358512
4 ENSG00000000419 DPM1 20 protein_coding 17.5575 43.7474 21.0119 22.9765 26.3166
5 ENSG00000000457 SCYL3 1 protein_coding 2.68196 3.7079 3.14505 3.82323 3.32028
6 ENSG00000000460 C1orf112 1 protein_coding 0.532179 2.46598 1.11985 0.584227 1.20095
大约有70列和13行,您只能看到以“p”结尾的列(V6:V10),但是数据框中有39列以“t”结尾。我想知道如何将这两个“t”和“p”分开,然后表示行
我尝试了
apply
、lappy
、grep
和split
但似乎仍然无法将它们分开。每当我尝试应用平均值时,它会返回所有的NA值,现在请确定从这里开始的方向。首先,您读取的数据不正确(导入时可能选择了header=FALSE
)。看起来您的第一行应该是标题,实际数据从第2行开始
names(df) <- df[1, ] #Give 1st row as column names
df <- df[-1, ] #Delete 1st row
因为我们之前弄乱了第一行,所以列的类型已经改变,我们需要将cols
转换为数值
df[cols] <- lapply(df[cols], as.numeric)
我不清楚您是想同时还是分别计算以“p”
和“t”
结尾的列的平均值。上面的计算加在一起。如果你想单独计算它们,你可以这样做
p_cols <- grep("P$", names(df))
t_cols <- grep("t$", names(df))
df[c(p_cols, t_cols)] <- lapply(df[c(p_cols, t_cols)], as.numeric)
df$P_Mean <- rowMeans(df[p_cols], na.rm = TRUE)
df$T_Mean <- rowMeans(df[t_cols], na.rm = TRUE)
p_cols这里是一个数据表
方法:
由于您没有提供任何可复制的示例数据,我不得不制作一个:
# load library
library(data.table)
# create data.table as the column binding of some letters and some numbers
dt <- cbind(data.table(x = LETTERS[1:5]),
as.data.table(matrix(sample(1:30, 30, FALSE),
nrow = 5)))
# the names aren't right, so we need to fix them according to your requirement:
names(dt) <- c("x", "1T", "2T", "3T", "1P", "2P", "3P")
在这里,我们在字符串的末尾寻找一个T,我们要搜索的向量是data.table本身的名称的向量
对Ps执行此操作只是同一个命令,当然,将Ts替换为Ps
dt[, averagePs := apply(.SD, 1, mean), .SDcols = grep("P$", names(dt))]
看起来您导入的数据没有标题,因此列名是V1,V2,…
,而不是gene\u id,…
。如果您解决了这个问题,您可以使用来选择列,例如P
列的列(stringr::str_detect(names(yourdata),“P$”)
。很抱歉不够清晰,我希望每个行(每个基因)都有一个平均值。使用cols@NewToR时,您是否完成了第一部分?是否更改列名并删除第一行<代码>名称(df)是的,我已经做了两个名称(df)@newt或者你的数据中有factor列。让我们从头开始。首先将所有数据转换为字符df[]啊,是的,似乎已经解决了整数问题。但是,我需要将P列和T列分离到它们自己的数据帧中,以便我可以分别表示行
# load library
library(data.table)
# create data.table as the column binding of some letters and some numbers
dt <- cbind(data.table(x = LETTERS[1:5]),
as.data.table(matrix(sample(1:30, 30, FALSE),
nrow = 5)))
# the names aren't right, so we need to fix them according to your requirement:
names(dt) <- c("x", "1T", "2T", "3T", "1P", "2P", "3P")
dt[, averageTs := apply(.SD, 1, mean), .SDcols = grep("T$", names(dt))]
dt[, averagePs := apply(.SD, 1, mean), .SDcols = grep("P$", names(dt))]