Включение одного компонента списка и повторное исключение всех остальных компонентов в R - PullRequest
0 голосов
/ 29 мая 2020

У меня есть список ценностей. Я хотел бы использовать первое значение в одной части функции, а остальные значения - в отдельной части функции. Затем я хотел бы использовать второе значение из списка в одной части функции и использовать оставшиеся значения (включая первое значение) в другой части функции.

Следующий код не является настоящим кодом, поскольку я исключил некоторые входные данные функций, но он показывает, что я пытаюсь сделать:

group <- c(1, 3, 4, 5, 9) #the complete group 
#It is important to note that these values are not continuous. They are distinct values. 


#include 1st unit of the list group as treatment and then use
#the remaining values as controls 

controls_not2 <- c(3, 4, 5, 9)
df1 <- dataprep(treatment = 1, controls = controls_not1) 
gaps.plot(dataprep = df1) 


#use the 2nd unit from the list as the treatment and use
#the remaining values as controls 

controls_not2 <- c(1, 4, 5, 9)
df2 <- dataprep(treatment = 3, controls = controls_not3) 
gaps.plot(dataprep = df3) 

В полном списке у меня около 50 значений. Есть ли способ перебрать все эти значения так, как я показал выше?


Вот дополнительная информация.

Используемые пакеты:

library(tidyverse) 
library(synth) 

Вот пример того, как выглядит полный код для создания единого графика.

treatment.identifier эквивалентно тому, что у меня есть как лечение в простом примере выше. Control.identifier эквивалентен тому, что у меня в качестве элементов управления в приведенном выше примере.

dataprep.out1 <- dataprep(foo = as.data.frame(df), 
                         predictors = predictors1, 
                         predictors.op = "mean", 
                         special.predictors = NULL, 
                         dependent = "logfatalitiespercapita", 
                         unit.variable = "state", 
                         time.variable = "year", 
                     treatment.identifier = "99", 
                     controls.identifier = controlstates, 
                     time.predictors.prior = c(1981:1985), 
                     time.optimize.ssr = c(1981:1985), #check on these years
                     time.plot = 1981:2003, 
                     unit.names.variable = "statenames") 

#identifying weights that create the best possible synthetic control unit for the treated 
synth.out1 <- synth(dataprep.out1)

#graph
spec1 <- gaps.plot(dataprep.res = dataprep.out1, synth.res = synth.out1, Xlab = c("Year"), Ylab = c("Gap"))

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Для сохранения результатов в списке значения игнорируются и в качестве индекса используется 1:50.

library(purrr)
result <- map(1:50, ~{ #replace 50 with the length of your list
df <- dataprep(treatment = group[[.x]], controls = group[[-.x]])
 gaps.plot(dataprep = df)})

Это аналогичное решение, основанное на решении выше.

newfunction <- function(x) {
    df <- dataprep(treatment = group[x], controls = group[-x])
     gaps.plot(dataprep = df)
}

graphs <- lapply(group, newfunction) 
0 голосов
/ 29 мая 2020
library(tidyverse)

myVec = 1:6

doSomething <- function(treatment, myVec){
  controls = myVec[! myVec == treatment]
  paste("Treatment:", treatment, "Controls:", paste(controls, collapse = "-"))
}
map_chr(myVec, ~ doSomething(.x, myVec))

[1] "Treatment: 1 Controls: 2-3-4-5-6" "Treatment: 2 Controls: 1-3-4-5-6" "Treatment: 3 Controls: 1-2-4-5-6"
[4] "Treatment: 4 Controls: 1-2-3-5-6" "Treatment: 5 Controls: 1-2-3-4-6" "Treatment: 6 Controls: 1-2-3-4-5"
0 голосов
/ 29 мая 2020

Сначала комментарий. Возможно, вы не захотите использовать «список» в качестве имени вектора, так как список - это тип данных в R. Вы можете подмножество вектора, ссылаясь на номер индекса. Пример ниже.

list1 <- c (1, 3, 4, 5, 9) # вся группа </p>

df1 <- dataprep(treatment = 1, controls = list1[c(1,3:length(list1))]) 
gaps.plot(dataprep = df1) 


#use the 2nd unit from the list as the treatment and use
#the remaining values as controls 

df2 <- dataprep(treatment = 3, controls = list1[c(2)]) 
gaps.plot(dataprep = df3) 
...