разбить столбец в R и найти среднее - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующий фрейм данных (взято небольшое подмножество из большого фрейма данных)

gene    counts  
a   1,4,5
b   2,1
c   9,2,4,5
d   1,2,3

Я хочу получить среднее значение столбца 2, а затем вывести его в качестве 3-го столбца.Итак, я хочу что-то вроде этого в качестве вывода:

gene    counts  avg
a   1,4,5   3.33
b   2,1 1.5
c   9,2,4,5 5
d   1,2,3   2

Я пробовал что-то вроде этого:

df <- read.table("test.txt",header=TRUE,sep="\t")
s <- strsplit(df$counts,split=",") # This creates a list with 4 elements in this case

Это превращается в символ?Любая помощь, как я могу получить среднее значение?

Спасибо

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Это будет работать:

df$mean <- sapply(strsplit(df$counts, ','), function(x) mean(as.numeric(x)))
0 голосов
/ 04 октября 2018

Ленивый подход с использованием eval и parse

sapply(paste0("mean(c(", df$counts, "))"), function(x) eval(parse(text=x)))
#   mean(c(1,4,5))     mean(c(2,1)) mean(c(9,2,4,5))   mean(c(1,2,3)) 
#    3.333333         1.500000         5.000000         2.000000 

data

df <- read.table(text=
"gene    counts  
a   1,4,5
b   2,1
c   9,2,4,5
d   1,2,3",header=TRUE, stringsAsFactors=FALSE)
0 голосов
/ 04 октября 2018

Мы можем пройти по list и получить среднее значение

df$avg <- sapply(s, function(x) mean(as.numeric(x)))
df$avg
#[1] 3.333333 1.500000 5.000000 2.000000

или используя tidyverse

library(tidyverse)
df %>%
   separate_rows(counts, sep = ",", convert = TRUE) %>%
   group_by(gene) %>%
   summarise(avg = mean(counts), counts = toString(counts))
# A tibble: 4 x 3
#  gene    avg counts    
#  <chr> <dbl> <chr>     
#1 a      3.33 1, 4, 5   
#2 b      1.5  2, 1      
#3 c      5    9, 2, 4, 5
#4 d      2    1, 2, 3   

data

df <- structure(list(gene = c("a", "b", "c", "d"), counts = c("1,4,5", 
"2,1", "9,2,4,5", "1,2,3")), class = "data.frame", row.names = c(NA, 
 -4L))

s <- strsplit(df$counts,split=",")
...