Сопоставление отрицательных и положительных значений с использованием цикла For в R - PullRequest
0 голосов
/ 13 июня 2018

Это мой первый пост, поэтому я надеюсь, что он не слишком элементарный.Я пытаюсь сопоставить наблюдения с отрицательной суммой с аналогами с положительной суммой и равным абс (суммой).Кроме того, я хочу проверить, что обе суммы принадлежат одной учетной записи.Для этого я пытаюсь использовать цикл 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?Заранее спасибо!

РЕДАКТИРОВАТЬ: Ниже приведен набор данных игрушки: чтобы проиллюстрировать этот пример.Например, для этого набора данных я хочу создать индикаторную переменную, которая будет равна 0, за исключением ID = 3, поскольку для наблюдения 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    "

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вот альтернативный метод достижения того же результата с намного меньшим количеством кода (и я думаю, что его тоже легче читать)

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

Если вы не знакомы с оператором канала (%>%), это позволяет нам избежать вложения многих функций друг в друга.Он работает, беря выходные данные предыдущей функции и вводя их в качестве первого аргумента следующей функции.Таким образом, этот код берет набор данных (Data), группирует его по Account, добавляет новый столбец с переменной индикатора с желаемым критерием, а затем разгруппирует данные, чтобы он вернулся к своему обычному формату.

Зацикливание выполняется в рамках этих вызовов функций, что позволяет их реализовывать на скомпилированных языках (обычно C ++) - что может быть намного быстрее, чем R.

0 голосов
/ 13 июня 2018

Вам необходимо использовать оператор == (= является оператором присваивания) и оператор && вместо & для логического условия:

## 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 <- a; см. Больше здесь ).

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

Для разницы между & и &&,second оценивает полное условие и первый каждый элемент (см. здесь ).

Также может быть более элегантно проверить, является ли сумма 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...