Вычисление среднего вектора, который присутствует в ячейке фрейма данных - PullRequest
0 голосов
/ 31 января 2020

У меня есть столбец (с именем 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

Однако, похоже, это работает неправильно , Вышеприведенная функция не дает мне среднее значение вектора, и она возвращает NaN, когда вектор содержит только 2 элемента. Ниже приведен пример того, как это выглядит

enter image description here

Ответы [ 3 ]

1 голос
/ 31 января 2020

Если у вас есть столбец 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
1 голос
/ 31 января 2020

Использование 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
0 голосов
/ 31 января 2020

Если перефразировать ваш вопрос, у вас есть столбец, содержащий числа, разделенные запятыми, и вы хотите превратить его в столбец, содержащий средние значения этих чисел?

# 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))))
...