Добавить число в каждом ряду и взять сумму - PullRequest
2 голосов
/ 05 марта 2020

Имея такой фрейм данных

data.frame(id = c(1,2), num = c("30, 4, -2,","10, 20"))

Как можно взять сумму каждой строки из столбца num и включить минус в расчет? Пример ожидаемого выхода?

data.frame(id = c(1,2), sum = c(32, 30)

Ответы [ 3 ]

4 голосов
/ 05 марта 2020

Используя Base R, вы можете сделать следующее:

# data
df <- data.frame(id = c(1,2), num = c("30, 4, -2,","10, 20"))

# split by ",", convert to numeric and then sum
df[, 2] <- sapply(strsplit(as.character(df$num), ","), function(x){
  sum(as.numeric(x))
})

# result 
df
#   id num
# 1  1  32
# 2  2  30
2 голосов
/ 05 марта 2020

Если вы можете использовать пакеты, пакеты tidy упростят эту задачу и будут использовать принципы данных tidy, которые становятся быстрыми и легкими, когда вы привыкнете думать таким образом.

library(tidyr)
library(dplyr)
df %>%
  # Convert the string of numbers to a tidy dataframe
  # with one number per row with the id column for grouping
  separate_rows(num,sep = ",") %>%
  # Convert the text to a number so we can sum
  mutate(num = as.numeric(num)) %>%
  # Perform the calculation for each id
  group_by(id) %>%
  # Sum the number
  summarise(sum = sum(num,na.rm = TRUE)) %>%
  # Ungroup for further use of the data
  ungroup()
# A tibble: 2 x 2
#      id   sum
#   <dbl> <dbl>
# 1     1    32
# 2     2    30
1 голос
/ 05 марта 2020
library(stringr)

df <- data.frame(id = c(1,2), num = c("30, 4, -2","10, 20"))

df$sum <- NA

for (i in 1:nrow(df)) {

  temp <- as.character(df[i,2])

  n_num <- str_count(temp, '[0-9.]+')

  total <- 0

  for (j in 1:n_num) {

    digit <- strsplit(temp, ',')[[1]][j]

    total <- total + as.numeric(digit)

    temp <- sub(digit, '', temp)

  }

  df[i, 'sum'] <- total

}

print(df)

  id       num sum
1  1 30, 4, -2  32
2  2    10, 20  30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...