使用该行中所有整数的总和替换列中的特定值

问题描述 投票:0回答:4

我有一个数据集,其中有一个名为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(),但我无法弄明白。

r
4个回答
2
投票

这看起来有点难看但应该有用。假设列QTY是一个字符 -

your_df$QTY_new <- sapply(strsplit(your_df$QTY, ", "), function(x) sum(as.numeric(x)))

0
投票

使用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

0
投票

我提出了解决问题的功能。但是,让我解释它是如何工作的:

     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函数作为迭代器工作,对于列表的每个元素,我们将使用以下函数:转换为numeric并返回它们的总和。

[EDIT_1]

要使用,如果你必须打电话:

sumInRow(<your data frame>$QYT)

我希望它对你有所帮助。


0
投票

这是tidyverse的一个选项,我们用分隔符,拆分'QTY'列来扩展行(separate_rows),按'ID','Name'分组,得到'QTY'的sum

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

data

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))
© www.soinside.com 2019 - 2024. All rights reserved.