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

我是R新手,有一个大数据框,我想用它在列名中用一个字母分隔数据,然后在末尾附加一个列,其中包含行的平均值。数据如下:

    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))]