我在进行一些重新编码时遇到困难(在R或SPSS中填入空单元格)
我正在使用长格式数据集(为了运行多级模型),其中每个响应者(ID变量)有三行,因此三个相同的ID号彼此相同(对于三个不同的momemts及时)。
问题在于,对于第二个变量(响应者的祖先),只有第一行有一个值,但每个响应者的两个第二行错过了(相同)值(0/1)。任何人都可以帮忙吗?我只习惯在同一行中重新编码......低于数据格式。
ID Ancestry
1003 1
1003 .
1003 .
1004 0
1004 .
1004 .
1005 1
1005 .
1005 .
答案 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).