在 R 中使用 For 循环匹配负值和正值

Posted

技术标签:

【中文标题】在 R 中使用 For 循环匹配负值和正值【英文标题】:Matching negative and positive values using For Loop in R 【发布时间】:2018-11-22 10:09:23 【问题描述】:

这是我的第一篇文章,所以我希望它不是太初级。我正在尝试将具有负数量的观察结果与具有正数量和相等绝对值(数量)的对应物相匹配。此外,我想检查金额是否都来自同一个帐户。为此,我尝试使用 for 循环,但出现以下错误:“操作可能仅适用于数字、逻辑或复杂类型。”到目前为止,这是我的代码:

for(i in 1:nrow(data))
  for(j in 1:nrow(data))
    if ((data$Amount[i]=abs(data$Amount[j]))&(data$Amount[i]!=data$Amount[j])&(data$Account[i]=data$Account[j]))
    data$debit[i]<-1

有谁知道为什么会发生这种情况,或者知道使用 Apply 函数系列的更好方法吗?提前谢谢!

编辑: 下面是一个玩具数据集:来说明这个例子。例如,在这个数据集上,我想创建一个指标变量,除了 ID=3 之外,它都是 0,因为对于观察,4.7=abs(-4.7) 和 "abc1"="abc1" 。

Data <- "   ID        Amount      Account 
            1          5.0         abc1          
            2         -5.0         abc9          
            3          4.7         abc1        
            4          4.6         abc7          
            5          5.0         abc8          
            6         -4.7         abc1    "

【问题讨论】:

请包含您的数据框示例,以便其他人更容易通过让他们运行代码来帮助您,您可以参考此问题格式:***.com/questions/5963269/… 根据您的建议更新 - 如果提供的数据足够,请告诉我。 【参考方案1】:

这是一种用更少代码实现相同结果的替代方法(我认为它也更容易阅读)

library(dplyr)
Data <- Data %>%
  group_by(Account) %>%
  mutate(
    debit = (Amount > 0 & -Amount %in% unique(Amount)) * 1
  ) %>%
  ungroup()

如果您不熟悉管道运算符 (%&gt;%),它可以让我们避免在彼此之间嵌套大量函数。它的工作原理是获取前一个函数的输出,并将其作为下一个函数的第一个参数输入。因此,此代码获取数据集 (Data),按 Account 对其进行分组,添加具有所需条件的指标变量的新列,然后取消分组数据使其恢复正常格式。

循环是在这些函数调用中完成的,这使得它们可以用编译语言(通常是 C++)来实现——这可能比 R 快很多。

【讨论】:

感谢您的回复!当我执行上述操作时,借记卡在内存中保存在哪里?为什么我不能追加 Data[4] 您完全按照以前的方式执行分配 - 使用 &lt;-。请参阅我更新的答案,我更新Data 以添加借记卡。在我的原始答案中,debit 被添加到发布到屏幕上的数据集版本中,但实际上没有保存任何内容(类似于您只写 mean(Data$Account) 得到的结果 - 计算结果发布到屏幕,但除非您将其分配给某物,否则不会保存。【参考方案2】:

对于您的逻辑条件,您需要使用== 运算符(= 是一个赋值运算符)和&amp;&amp; 而不是&amp; 运算符:

## Assignment (incorrect in this case!)
1 = 1
# Error in 1 = 1 : invalid (do_set) left-hand side to assignment
a <- 1
a = a

请注意,a = a 没有逻辑检查(仅相当于 a &lt;- a;查看更多 here)。

## Checking equivalence (returns a logical)
1 == 1
# [1] TRUE
a == a
# [1] TRUE

对于&amp;&amp;&amp; 之间的区别,第二个评估完整条件,第一个评估每个元素(请参阅here)。

此外,检查data$Amount[i]data$Amount[j] 的总和是否为空可能比检查它们是否具有第一个绝对值但有符号值不同可能更优雅。

## Your example
for(i in 1:nrow(data))
  for(j in 1:nrow(data))
    if ( (sum(c(data$Amount[i], data$Amount[j])) == 0) && (data$Account[i] == data$Account[j]) ) 
            data$debit[i]<-1
        
    

【讨论】:

以上是关于在 R 中使用 For 循环匹配负值和正值的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种方法可以基于for循环中匹配的文件名在r中创建列表?

请问spss在pearson相关性分析中r值的负值与正值代表啥意思?

当匹配所有数字时,r for循环

SELECT SQL 匹配号码

如何从R中的数据框中删除负值

R语言ggplot2可视化发散棒棒糖图发散棒棒糖图可以同时处理负值和正值并按照大小排序区分数据在棒棒糖图的数据点钟添加数值标签(Diverging Lollipop Chart )