Дан фрейм данных, и цель состоит в том, чтобы вычислить значение прямой зависимости между двумя столбцами фрейма данных.
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
Спасибо за помощь.
ab - ba всегда будет 0. Например, 5*4 - 4*5 = 20 - 20 = 0. Ваш вопрос не ясен.
@user1945827 user1945827 Я не ищу умножения значений в столбцах.
Один из вариантов — создать группы со значениями 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
Идея с использованием базы 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
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
@jogo ошибка :\