我有一个数据集,其中有一个名为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(),但我无法弄明白。
这看起来有点难看但应该有用。假设列QTY
是一个字符 -
your_df$QTY_new <- sapply(strsplit(your_df$QTY, ", "), function(x) sum(as.numeric(x)))
使用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
我提出了解决问题的功能。但是,让我解释它是如何工作的:
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)
我希望它对你有所帮助。
这是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
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))