Замена определенных значений в столбце суммой всех целых чисел в этой строке - PullRequest
0 голосов
/ 13 марта 2019

У меня есть набор данных, в котором есть столбец с именем QTY, в котором большинство значений уже суммированы, но некоторые представляют собой несколько целых чисел, разделенных запятыми.Как я могу заменить эти строки суммами значений?

У меня есть:

ID    Name    QTY
1     Abc     2
2     Bac     3
3     Cba     2, 4, 5, 8
4     Bcb     4, 1

Желаемый результат:

ID    Name    QTY
1     Abc     2
2     Bac     3
3     Cba     19
4     Bcb     5

Я пытался возиться сдля цикла for и использования ifelse (), но я не могу понять это.

Ответы [ 4 ]

2 голосов
/ 13 марта 2019

Это выглядит немного некрасиво, но должно работать. Предполагая, что столбец QTY является символом -

your_df$QTY_new <- sapply(strsplit(your_df$QTY, ", "), function(x) sum(as.numeric(x)))
0 голосов
/ 14 марта 2019

Вот один вариант с tidyverse. Мы разделяем столбец «QTY» по разделителю ,, чтобы развернуть строки (separate_rows), сгруппированные по «ID», «Имя», получить sum 'QTY'

library(tidyverse)
df1 %>% 
  separate_rows(QTY, convert = TRUE) %>% 
  group_by(ID, Name) %>% 
  summarise(QTY = sum(QTY))
# A tibble: 4 x 3
# Groups:   ID [4]
#     ID Name    QTY
#  <int> <chr> <int>
#1     1 Abc       2
#2     2 Bac       3
#3     3 Cba      19
#4     4 Bcb       5

данные

df1 <- structure(list(ID = 1:4, Name = c("Abc", "Bac", "Cba", "Bcb"), 
QTY = c("2", "3", "2, 4, 5, 8", "4, 1")), class = "data.frame", row.names = c(NA, 
  -4L))
0 голосов
/ 13 марта 2019

Я сделал функцию для решения вашего вопроса.Но позвольте мне объяснить, как это работает:

     sumInRow = function(row_value, split = ",") {
         # 1. split the values
         row_value = strsplit(row_value, split = split)

         # 2. Convert them to numeric and sum
         row_sum = sapply(row_value, function(single_row) {
              single_row = as.numeric(single_row)
              return(sum(single_row))
         })

         return(row_sum)
    }

Значение row_value по умолчанию будет символом из-за запятой.Затем для каждого значения нам нужно разделить их:

    row_value = strsplit(row_value, split = split)

Но он вернет список, содержащий разделение для всех элементов в row_value , не беспокойтесь, мы будем использовать его позже.

    row_sum = sapply(row_value, function(single_row) {
          single_row = as.numeric(single_row)
          return(sum(single_row))
    })

Функция Sapply работает как интегратор, для каждого элемента списка мы будем использовать следующую функцию: преобразовать в числовое значение и вернуть их сумму.

[EDIT_1]

Чтобы использовать, если вам нужно позвонить:

sumInRow(<your data frame>$QYT)

Надеюсь, это поможет вам.

0 голосов
/ 13 марта 2019

Использование циклов for должно быть таким:

data <- data.table(ID = 1:4,
                   Name = c("Abc", "Bac", "Cba", "Bcb"),
                   QTY = c("2", "3", "2, 4, 5, 8", "4, 1"),
                   QTY2 = numeric(4))

for(i in 1:nrow(data)){
  data$QTY2[i] <- sum(as.numeric(unlist(strsplit(as.character(data$QTY[i]), ', '))))
}

и результирующий DF:

   ID Name        QTY QTY2
1:  1  Abc          2    2
2:  2  Bac          3    3
3:  3  Cba 2, 4, 5, 8   19
4:  4  Bcb       4, 1    5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...