如何估算后续行中缺失的观察结果?
How to impute missing observations in subsequent rows?
我在重新编码时遇到困难(在 R 或 SPSS 中填充空单元格)
我正在处理一个长格式数据集(为了 运行 一个多层次模型),其中每个受访者(ID 变量)有三行,因此每行下面的相同 ID 号的三倍其他(三个不同的时刻)。
问题在于,对于第二个变量(受访者的祖先),只有第一行有一个值,但每个受访者的第二行都缺少该(相同)值 (0/1)。任何人都可以帮忙吗?我只习惯于在同一行内重新编码……在数据格式下方。
ID Ancestry
1003 1
1003 .
1003 .
1004 0
1004 .
1004 .
1005 1
1005 .
1005 .
我们可以使用 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
如果需要分组"ID"
library(data.table)
setDT(df1)[, Ancestry := na.locf(Ancestry), by = ID]
在 SPSS 中,这应该可以完成工作,假设 "Ancestry" 变量是数字:
AGGREGATE /OUTFILE=* MODE=ADDVARIABLES OVERWRITEVARS=YES/BREAK=ID /Ancestry=MAX(Ancestry).
如果"Ancestry"是一个字符串,你可以这样做:
sort cases by ID Ancestry (d).
if ID=lag(ID) and Ancestry="" Ancestry=lag(Ancestry).
execute.
另一种实现此目的的简单方法是 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
。
一旦您通过自己喜欢的方法将 .
转换为 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
IF (ID EQ LAG(ID)) Ancestry=LAG(Ancestry).
或者:
IF (ID EQ LAG(ID) AND MISSING(Ancestry)) Ancestry=LAG(Ancestry).
我在重新编码时遇到困难(在 R 或 SPSS 中填充空单元格)
我正在处理一个长格式数据集(为了 运行 一个多层次模型),其中每个受访者(ID 变量)有三行,因此每行下面的相同 ID 号的三倍其他(三个不同的时刻)。
问题在于,对于第二个变量(受访者的祖先),只有第一行有一个值,但每个受访者的第二行都缺少该(相同)值 (0/1)。任何人都可以帮忙吗?我只习惯于在同一行内重新编码……在数据格式下方。
ID Ancestry
1003 1
1003 .
1003 .
1004 0
1004 .
1004 .
1005 1
1005 .
1005 .
我们可以使用 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
如果需要分组"ID"
library(data.table)
setDT(df1)[, Ancestry := na.locf(Ancestry), by = ID]
在 SPSS 中,这应该可以完成工作,假设 "Ancestry" 变量是数字:
AGGREGATE /OUTFILE=* MODE=ADDVARIABLES OVERWRITEVARS=YES/BREAK=ID /Ancestry=MAX(Ancestry).
如果"Ancestry"是一个字符串,你可以这样做:
sort cases by ID Ancestry (d).
if ID=lag(ID) and Ancestry="" Ancestry=lag(Ancestry).
execute.
另一种实现此目的的简单方法是 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
。
一旦您通过自己喜欢的方法将 .
转换为 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
IF (ID EQ LAG(ID)) Ancestry=LAG(Ancestry).
或者:
IF (ID EQ LAG(ID) AND MISSING(Ancestry)) Ancestry=LAG(Ancestry).