如何在后续行中估算缺失的观察结果?

时间:2016-05-08 12:03:11

标签: r spss

我在进行一些重新编码时遇到困难(在R或SPSS中填入空单元格)

我正在使用长格式数据集(为了运行多级模型),其中每个响应者(ID变量)有三行,因此三个相同的ID号彼此相同(对于三个不同的momemts及时)。

问题在于,对于第二个变量(响应者的祖先),只有第一行有一个值,但每个响应者的两个第二行错过了(相同)值(0/1)。任何人都可以帮忙吗?我只习惯在同一行中重新编码......低于数据格式。

ID      Ancestry    
1003    1
1003    .
1003    .
1004    0
1004    .
1004    .
1005    1
1005    .
1005    .

5 个答案:

答案 0 :(得分:4)

我们可以使用na.locf假设.隐含NA个值。

 library(zoo)
 df1$Ancestry <- na.locf(df1$Ancestry)

如果列是非数字的,即以.作为值,那么我们需要将其转换为数字,以便.强制转换为NA,然后我们对其应用na.locf

 df1$Ancestry <- na.locf(as.numeric(df1$Ancestry))
 df1$Ancestry
 #[1] 1 1 1 0 0 0 1 1 1

如果需要按&#34; ID&#34;

分组
 library(data.table)
 setDT(df1)[, Ancestry := na.locf(Ancestry), by = ID]

答案 1 :(得分:2)

在SPSS中,这应该可以胜任,假设&#34; Ancestry&#34;变量是数字:

AGGREGATE /OUTFILE=* MODE=ADDVARIABLES OVERWRITEVARS=YES/BREAK=ID /Ancestry=MAX(Ancestry).

如果&#34;祖先&#34;是一个字符串,你可以这样:

sort cases by ID Ancestry (d).
if ID=lag(ID) and Ancestry="" Ancestry=lag(Ancestry).
execute.

答案 2 :(得分:2)

实现此目的的另一个简单方法是在R以下,使用实际值始终出现在每个ID的第一个位置的事实:

library(dplyr)
df %>% group_by(ID) %>% mutate(Ancestry = Ancestry[1])

Source: local data frame [9 x 2]
Groups: ID [3]

     ID Ancestry
  (int)    (chr)
1  1003        1
2  1003        1
3  1003        1
4  1004        0
5  1004        0
6  1004        0
7  1005        1
8  1005        1
9  1005        1

如果您更喜欢base解决方案,我认为我可能会做的是以下内容,但有很多方法可以实现相同的目标:首先,请注意,如果df是您的数据框,那么

 df$Ancestry <- as.numeric(df$Ancestry)

会强制.加入NA。然后我们可以使用

df_id <- df[complete.cases(df),]
df$Ancestry <- NULL
df <- merge(df, df_id, all.x = T)

给出相同的输出。在这里,我选择仅包含完整条目的dataframe,并merge将其恢复为原始dataframe

答案 3 :(得分:2)

按照您最喜欢的方法将.转换为NA后,这正是tidyr::fill设计的目的:

library(tidyr)

df %>% extract(Ancestry, 'Ancestry', convert = TRUE) %>% fill(Ancestry)
# 
#     ID Ancestry
# 1 1003        1
# 2 1003        1
# 3 1003        1
# 4 1004        0
# 5 1004        0
# 6 1004        0
# 7 1005        1
# 8 1005        1
# 9 1005        1

答案 4 :(得分:2)

IF (ID EQ LAG(ID)) Ancestry=LAG(Ancestry).

或者:

IF (ID EQ LAG(ID) AND MISSING(Ancestry)) Ancestry=LAG(Ancestry).