首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从R dataframe中删除负值和一个正值

从R dataframe中删除负值和一个正值
EN

Stack Overflow用户
提问于 2019-07-22 22:57:19
回答 3查看 2K关注 0票数 0

我有一个数据帧,其中一列是花费的金额。在“花费的金额”列中,有“花费的金额”的值,也有任何回报的负值。例如。

代码语言:javascript
运行
复制
ID    Store    Spent
123    A        18.50
123    A       -18.50
123    A        18.50

我想去掉负值,然后再去掉它的一个正值--我的想法是只保留完整的支出金额,这样我就可以查看总支出。

现在我的想法是这样的--我按照开销对数据帧进行排序

代码语言:javascript
运行
复制
if spend < 0 {
  take absolute value of spend
  if diff between abs(spend) and spend+1 = 0 then both are NA}

我想要一些像这样的东西

代码语言:javascript
运行
复制
df[df$spend < 0] <- NA

在这里我也可以将一个积极的对应物设置为NA。有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-22 23:22:34

应该有一个更简单的解决方案,但这里有一种方法。我还创建了我自己的示例,因为共享的示例没有足够的数据点来测试

代码语言:javascript
运行
复制
#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
票数 2
EN

Stack Overflow用户

发布于 2019-07-23 00:52:28

如果您添加了一个rowid列,则可以使用data.table ant-joins完成此操作。

这是一个考虑ID的示例,除非它们是相同的ID,否则不删除“积极的对应项”

首先创建更有趣的样本数据

代码语言:javascript
运行
复制
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
')

现在删除所有具有正对应值的负值,并删除这些对应值

代码语言:javascript
运行
复制
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矢量示例

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2019-07-22 23:35:24

我使用了以下代码。

代码语言:javascript
运行
复制
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))

要获得此输出,请执行以下操作:

代码语言:javascript
运行
复制
# A tibble: 3 x 2
  store net_expenditure
  <chr>           <dbl>
1 A               13.3 
2 B                8.17
3 C               16.6 

或者,如果您想要每个store-id对的净支出,则可以使用以下代码:

代码语言:javascript
运行
复制
tibble(store, id, expense) %>%
  group_by(store, id) %>%
  summarise(net_expenditure = sum(expense))

我从一个稍微不同的角度来处理你的问题。我不确定我的代码是否回答了您的问题,但它可能会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57148701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档