1) dplyr / tidyr Предполагая, что ввод DF
, воспроизводимый в примечании в конце, разделяет Column A
на отдельные строки, суммирует его и присоединяет новый столбец req к исходному фрейму данных.
library(dplyr)
library(tidyr)
Req <- DF %>%
separate_rows(`Column A`, convert = TRUE) %>%
group_by(`Sl no`) %>%
summarize(req = mean(abs(`Column A`[-1] - `Column A`[1]))) %>%
ungroup
DF %>% inner_join(Req)
## Joining, by = "Sl no"
## Sl no Column A req
## 1 1 1 > 3 > 5 > 2 2.333333
## 2 2 2 > 5 > 1 > 10 > 5 3.750000
2) Base R Используется базовое решение R AvgAbsDiff
, которое принимает символьную строку в формате Column A
, читает ее с использованием scan
и вычисляетreq
.Затем он применяется к каждой строке.
AvgAbsDiff <- function(x) {
z <- scan(text = x, sep = ">", quiet = TRUE)
mean(abs(z[-1] - z[1]))
}
transform(DF, req = sapply(as.character(`Column A`), AvgAbsDiff),
row.names = NULL, check.names = FALSE)
## Sl no Column A req
## 1 1 1 > 3 > 5 > 2 2.333333
## 2 2 2 > 5 > 1 > 10 > 5 3.750000
2a) В этом базовом решении не используются никакие * функции применения.Считайте Column A
в кадр данных, используя read.table
, а затем вычислите req
из этого.
r <- read.table(text = as.character(DF$`Column A`), header = FALSE,
sep = ">", fill = NA)
transform(DF, req = rowMeans(abs(r[, -1] - r[, 1]), na.rm = TRUE),
check.names = FALSE)
## Sl no Column A req
## 1 1 1 > 3 > 5 > 2 2.333333
## 2 2 2 > 5 > 1 > 10 > 5 3.750000
Примечание
DF <-
structure(list(`Sl no` = 1:2, `Column A` = structure(1:2,
.Label = c("1 > 3 > 5 > 2",
"2 > 5 > 1 > 10 > 5"), class = "factor")),
class = "data.frame", row.names = c(NA, -2L))