Вычислить прямые зависимости между значениями кадра данных в R - PullRequest
0 голосов
/ 28 мая 2019

Дан фрейм данных, и цель состоит в том, чтобы вычислить значение прямой зависимости между двумя столбцами фрейма данных.

c1  c2   N
a    b   30
a    c   5
a    d   10
c    a   5
b    a   10

мы ищем, чтобы получить отношения прямой зависимости, дляНапример, для a и b это значение равно ab - ba = 20.Окончательный результат должен выглядеть следующим образом:

c1  c2   N     DepValue
a    b   30    ab - ba = 20
a    c   5     ac - ca = 0
a    d   10    ad- 0 = 10
c    a   5     ca - ac= 0
b    a   10    ba - ab = 20

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 28 мая 2019
D <- read.table(header=TRUE, stringsAsFactors = FALSE, text=
"c1  c2   N
a    b   30
a    c   5
a    d   10
c    a   5
b    a   10")

N12 <- D$N
names(N12) <- paste0(D$c1, D$c2)
N21 <- N12[paste0(D$c2, D$c1)]
D$depValue <- D$N - ifelse(is.na(N21), 0, N21)

результат:

> D
  c1 c2  N depValue
1  a  b 30       20
2  a  c  5        0
3  a  d 10       10
4  c  a  5        0
5  b  a 10      -20
1 голос
/ 28 мая 2019

Один из вариантов - создать группы со значениями pmin и pmax, равными c1 и c2, и принять разницу между этими двумя значениями.Это вернет NA для групп только с одним значением, мы можем replace этих NA с первым значением в группе.

library(dplyr)

df %>%
  group_by(group1 = pmin(c1, c2), group2 = pmax(c1, c2)) %>%
  mutate(dep = N[1] - N[2], 
         dep = replace(dep, is.na(dep), N[1])) %>%
  ungroup() %>%
  select(-group1, -group2)

#   c1    c2      N   dep
#  <chr> <chr> <int> <int>
#1 a     b        30    20
#2 a     c         5     0
#3 a     d        10    10
#4 c     a         5     0
#5 b     a        10    20
0 голосов
/ 28 мая 2019

Идея через базу R состоит в том, чтобы отсортировать столбцы c1 и c2, разделить на основе этих значений и вычесть N, то есть

i1 <- paste(pmin(df$c1, df$c2), pmax(df$c1, df$c2))
i1
#[1] "a b" "a c" "a d" "a c" "a b"

do.call(rbind, lapply(split(df, i1), function(i) {i['DepValue'] <- Reduce(`-`, i$N); i}))
#      c1 c2  N DepValue
#a b.1  a  b 30       20
#a b.5  b  a 10       20
#a c.2  a  c  5        0
#a c.4  c  a  5        0
#a d    a  d 10       10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...