计算数据框单元格中存在的向量的平均值

Calculating the mean of a vector that is present in a data frame cell

我在包含自然数和自然数向量的数据框中有一列(名为 A)。 对于其中存在自然数向量的单元格,我想计算该向量的平均值。 然后我想将最终结果存储在一个名为 B.

的新列中

目前,我尝试执行以下操作:

Val <- unlist(lapply(str_split(data$A, ","),
                     function(x) mean(as.numeric(x), na.rm=TRUE)))
Val[length(Val)] <- mean(Val[-length(Val)], na.rm=TRUE)
data$B <- Val

但是,这似乎无法正常工作。上面的函数没有为我提供向量的平均值,当向量中只有 2 个元素时,它是 returns NaN。下面是它的外观示例

使用eval/parse:

# example data
df1 <- read.table(text = "
A
1
2
3
2
3
c(1,2,4)
3
3
c(2,3)", header = TRUE, stringsAsFactors = FALSE)


df1$B <- sapply(df1$A, function(i) mean(eval(parse(text = i))))

df1
#          A        B
# 1        1 1.000000
# 2        2 2.000000
# 3        3 3.000000
# 4        2 2.000000
# 5        3 3.000000
# 6 c(1,2,4) 2.333333
# 7        3 3.000000
# 8        3 3.000000
# 9   c(2,3) 2.500000

如果您将列 A 作为文本,另一种方法是使用 gsub 从列中删除多余的字符,以逗号分隔,然后使用 mean。使用@zx8754 的数据

sapply(strsplit(gsub('[c()]', '', df1$A), ","), function(x) mean(as.numeric(x)))
#[1] 1.000 2.000 3.000 2.000 3.000 2.333 3.000 3.000 2.500

为了解释你的问题,你有一个包含逗号分隔数字的列,你想把它变成一个包含这些数字平均值的列?

# data frame containing character vector of numbers
df = data.frame(A=c("1", "3", "3,4,5", "1, 6"), stringsAsFactors = F)

# convert to list of character vectors
df$B = strsplit(df$A, ",")

# convert to numeric and calculate mean
df$mean = sapply(df$B, function(x) mean(as.numeric(x)))

理解这一点的关键是我示例中的 df$B 是数据框中的列表。

这种示例也适用于 tidyverse 包:

library(tidyverse)
df = tibble(A=c("1", "3", "3,4,5", "1, 6"))

df %>%
    mutate(B = str_split(A, ",")) %>%
    mutate(mean = map_dbl(B, function(x) mean(as.numeric(x))))