我有一个数据帧,其中一列是花费的金额。在“花费的金额”列中,有“花费的金额”的值,也有任何回报的负值。例如。
ID Store Spent
123 A 18.50
123 A -18.50
123 A 18.50
我想去掉负值,然后再去掉它的一个正值--我的想法是只保留完整的支出金额,这样我就可以查看总支出。
现在我的想法是这样的--我按照开销对数据帧进行排序
if spend < 0 {
take absolute value of spend
if diff between abs(spend) and spend+1 = 0 then both are NA}
我想要一些像这样的东西
df[df$spend < 0] <- NA
在这里我也可以将一个积极的对应物设置为NA。有什么建议吗?
发布于 2019-07-22 23:22:34
应该有一个更简单的解决方案,但这里有一种方法。我还创建了我自己的示例,因为共享的示例没有足够的数据点来测试
#Original vector
x <- c(1, 2, -2, 1, -1, -1, 2, 3, -4, 1, 4)
#Count the frequency of negative numbers, keeping all the unique numbers
vals <- table(factor(abs(x[x < 0]), levels = unique(abs(x))))
#Count the frequency of absolute value of original vector
vals1 <- table(abs(x))
#Subtract the frequencies between two vectors
new_val <- vals1 - (vals * 2 )
#Recreate the new vector
as.integer(rep(names(new_val), new_val))
#[1] 1 2 3
发布于 2019-07-23 00:52:28
如果您添加了一个rowid列,则可以使用data.table ant-joins完成此操作。
这是一个考虑ID的示例,除非它们是相同的ID,否则不删除“积极的对应项”
首先创建更有趣的样本数据
df <- fread('
ID Store Spent
123 A 18.50
123 A -18.50
123 A 18.50
123 A -19.50
123 A 19.50
123 A -99.50
124 A -94.50
124 A 99.50
124 A 94.50
124 A 94.50
')
现在删除所有具有正对应值的负值,并删除这些对应值
negs <- df[Spent < 0][, Spent := -Spent][, rid := rowid(ID, Spent)]
pos <- df[Spent > 0][, rid := rowid(ID, Spent)]
pos[!negs, on = .(ID, Spent, rid), -'rid']
# ID Store Spent rid
# 1: 123 A 18.5 2
# 2: 124 A 99.5 1
# 3: 124 A 94.5 2
并将其应用于罗纳克的x
矢量示例
x <- c(1, 2, -2, 1, -1, -1, 2, 3, -4, 1, 4)
negs <- data.table(x = -x[x<0])[, rid := rowid(x)]
pos <- data.table(x = x[x>0])[, rid := rowid(x)]
pos[!negs, on = names(pos), -'rid']
# x
# 1: 2
# 2: 3
# 3: 1
发布于 2019-07-22 23:35:24
我使用了以下代码。
library(dplyr)
store <- rep(LETTERS[1:3], 3)
id <- c(1:4, 1:3, 1:2)
expense <- runif(9, -10, 10)
tibble(store, id, expense) %>%
group_by(store) %>%
summarise(net_expenditure = sum(expense))
要获得此输出,请执行以下操作:
# A tibble: 3 x 2
store net_expenditure
<chr> <dbl>
1 A 13.3
2 B 8.17
3 C 16.6
或者,如果您想要每个store-id对的净支出,则可以使用以下代码:
tibble(store, id, expense) %>%
group_by(store, id) %>%
summarise(net_expenditure = sum(expense))
我从一个稍微不同的角度来处理你的问题。我不确定我的代码是否回答了您的问题,但它可能会有所帮助。
https://stackoverflow.com/questions/57148701
复制相似问题