我有一个数据集,该数据集包含一个称为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()来解决问题,但是我不太清楚。
答案 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))