обратный выбор кода vars в df1 при условии поиска значений в df2 - PullRequest
1 голос
/ 03 февраля 2020

Я конвертирую старый базовый код R в Tidyverse и могу использовать некоторую помощь. Я хочу изменить код некоторых переменных в df1 при условии, что переменная помечена как positive==1 в справочной таблице df2. Вот мое базовое решение R:

library(tidyverse)
set.seed(1)
df1 <- data.frame(item1 = sample(1:4, 10, replace = TRUE),
                  item2 = sample(1:4, 10, replace = TRUE),
                  item3 = sample(1:4, 10, replace = TRUE))

df1

#    item1 item2 item3
# 1      2     1     4
# 2      2     1     1
# 3      3     3     3
# 4      4     2     1
# 5      1     4     2
# 6      4     2     2
# 7      4     3     1
# 8      3     4     2
# 9      3     2     4
# 10     1     4     2

df2 <- data.frame(name = c("item1", "item2"),
                  positive = c(1, 0))

#    name positive
# 1 item1        1
# 2 item2        0

vars <- c("item1", "item2")

# reverse code if positive==1
# 4=1, 3=2, 2=3, 1=4
for (i in vars) {
  if (df2$positive[df2$name==i]==1) { 
    df1[i] <- 4 - df1[, i] + 1    # should reverse code item1
  }
}

df1

#    item1 item2 item3
# 1      3     1     4
# 2      3     1     1
# 3      2     3     3
# 4      1     2     1
# 5      4     4     2
# 6      1     2     2
# 7      1     3     1
# 8      2     4     2
# 9      2     2     4
# 10     4     4     2

1 Ответ

2 голосов
/ 03 февраля 2020

Мы можем использовать mutate_at, где мы указываем vars путем подстановки столбца «имя» на основе двоичных значений «положительных», преобразованных в logical и вычитания 4 из столбца

library(dplyr)
dfn <- df1 %>%
         mutate_at(vars(intersect(names(.),
          as.character(df2$name)[as.logical(df2$positive)])),  ~ 4 - . + 1)
dfn
#    item1 item2 item3
#1      3     1     4
#2      3     1     1
#3      2     3     3
#4      1     2     1
#5      4     4     2
#6      1     2     2
#7      1     3     1
#8      2     4     2
#9      2     2     4
#10     4     4     2

Или с base R

vars1 <- with(df2, as.character(name[as.logical(positive)]))
df1[vars1] <- lapply(df1[vars1], function(x) 4 - x + 1)

data

df1 <- structure(list(item1 = c(2L, 2L, 3L, 4L, 1L, 4L, 4L, 3L, 3L, 
1L), item2 = c(1L, 1L, 3L, 2L, 4L, 2L, 3L, 4L, 2L, 4L), item3 = c(4L, 
1L, 3L, 1L, 2L, 2L, 1L, 2L, 4L, 2L)), class = "data.frame", 
row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...