Я сделал этот простой фрейм данных, чтобы прояснить свой вопрос:

id = c(11, 12, 13, 14, 15) 
referenceperson = c("yes", "no", "yes", "no", "yes") 
smoke = c(3, 4, 3, NA, 2) 
spouseid = c(12, 11, NA, 15, 14) 
dataframe = data.frame(id, referenceperson , smoke, spouseid)

Я хотел бы получить количество курящих только супруга контрольного лица, в этом примере значение 4 из первого наблюдения.

Я потерялся здесь и спасибо за любую помощь

2
Ben K. 27 Ноя 2016 в 19:59

2 ответа

Лучший ответ

Используя только значения в вашем объекте dataframe, вы пройдете через него и представите компактный метод получения единственного значения, которое вы запрашиваете, а затем всех значений:

> dataframe[ match(dataframe$spouseid[1], data.frame$id) , 'smoke']
[1] 4

Это был метод получения индекса супруга первого лица и его использования для получения значения «дыма» в указанной строке. Следующая строка демонстрирует, что match предоставит вам все такие индексы, а там, где их нет, вернет NA.

> match(dataframe$spouseid, dataframe$id)
[1]  2  1 NA  5  4

В R использование NA в качестве индекса во фрейме данных вернет NA, а не нулевое значение. Это сохраняет информацию о последовательности. Следовательно, вы можете получить все ценности курения супругов с помощью этого:

> dataframe[ match(dataframe$spouseid, dataframe$id) , 'smoke']
[1]  4  3 NA  2 NA

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

> dataframe$smk_stat_spouse <- 
                    dataframe[ match(dataframe$spouseid, dataframe$id) , 'smoke']
> dataframe
  id referenceperson smoke spouseid smk_stat_spouse
1 11             yes     3       12               4
2 12              no     4       11               3
3 13             yes     3       NA              NA
4 14              no    NA       15               2
5 15             yes     2       14              NA
3
IRTFM 27 Ноя 2016 в 19:07

Я считаю, что нашел решение, хотя оно очень грязное (я новичок в r)

df1 <- cbind(id, referenceperson)
df1 <- as.data.frame(df1)

df2 <- cbind(spouseid, smoke)
df2 <- as.data.frame(df2)

matched <- df2$smoke[match(df1$id, df2$spouseid) ]

refp <- ifelse(referenceperson=="yes", 1, referenceperson)
refp <- ifelse(refp=="no", NA, refp)
refp <- as.numeric(refp)
refp*matched
0
Ben K. 27 Ноя 2016 в 17:35