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

时间:2019-03-13 18:52:34

标签: r

我有一个数据集,该数据集包含一个称为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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

使用循环应该是这样的:

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

答案 2 :(得分: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函数用作插入函数,对于列表的每个元素,我们将使用以下函数:转换为数字并返回它们的总和。

[EDIT_1]

在必须致电时使用:

sumInRow(<your data frame>$QYT)

希望对您有帮助。

答案 3 :(得分:0)

这里是tidyverse的一个选项,我们用定界符,分隔'QTY'列,以扩展行(separate_rows),并按'ID','Name'分组,获取“数量”的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

数据

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