计算数据框单元格中存在的向量的平均值
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))))
我在包含自然数和自然数向量的数据框中有一列(名为 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))))