我目前正在研究卢旺达的家庭数据集。在这里,我们采访了青少年的各种主题。作为数据收集的一部分,我们编制了家庭网格。我们基本上要求青少年向我们提供有关他们住在一起的家庭成员的一些信息。结果是家庭网格可能如下所示:
df<-data.frame(read.table(header = TRUE, text = "
ID Age Rel_1 Age_1 Rel_2 Age_2 Rel_3 Age_3
1 . Self 12 Dad 40 Mom 38
2 . Dad 50 Mom 50 Self 22
3 . Granddad 75 Mom 40 Self 15
4 . Dad 45 Self 15 Mom 44
5 . Mom 50 Sister 18 Self 22
"))
每一行都是指青少年。因此,在我组成的这个例子中,我们看到三个家庭成员,包括少年本人。第二列是空的。
基于家庭网格中的信息(包括Rel_1
,Age_1
,Rel_2
,Age_2
,Rel_3
,Age_3
列),我想确定我们采访的青少年的年龄。
我基本上需要查看三个成员中的哪一个被标记为&#34; Self&#34;。列Rel_$
基本上表示该家庭成员与青少年的关系。在某些情况下,它是父亲或母亲等。每当专栏提到&#34; Self&#34;时,就意味着家庭成员是青少年。
基本上,我们需要查找我们找到的Rel-column&#34; Self&#34;。年龄栏中的相应条目是青少年的年龄。例如,在受访者1的情况下,Rel_1
是&#34; Self&#34;。因此,Age_1
列中的条目是青少年的年龄。它是12.在第二个被访者的情况下,它是22.
我可以从家庭网格中提取信息(包括Rel_1
,Age_1
,Rel_2
,Age_2
,Rel_3
,{{1}列})通过编写许多代码手动填充空列Age_3
。但是,这不是一个优雅的解决方案。此外,我的家庭网格由15名成员和大约20个变量组成。因此,它需要丢失编码,我想避免。
答案 0 :(得分:1)
如果我理解正确,您希望用年龄(自我年龄)填写年龄栏。我粘贴下面的代码来做到这一点,希望它会有所帮助
df_3<-df
for(i in 1:nrow(df))
{
a<-which(df[i,]=="Self")+1
df_3[i,2]<-df[i,a]
}
答案 1 :(得分:1)
R apply
函数用作循环的简洁方法,例如示例中df
行的循环。同样对于这种情况,对行数据进行操作的表达式有点复杂,因此我们将使用由function(x).
定义的匿名函数实现逻辑代码看起来像
df$Age <- as.integer(apply(df, 1, function(x) x[which(x == "Self")+1]))
此处x
是一个包含df
行的字符向量。 which(x == "Self")+1
与Age
代码中的Self
一样,返回包含jayashree rout's
的列的编号。不是将其存储在中间变量a
中,而是直接在x[ ]
中使用它来选择包含Age
值的列。 apply
形成包含这些结果的字符向量或列表(如果找不到行的Self
)。这将转换为整数向量,然后存储在df$Age
中。
结果应该与jayashree rout's
代码中的结果相同,他应该对算法有所了解。 apply
及其家庭成员(sapply
,lapply
,mapply
)以及匿名函数在R中非常常用。因为您表示您正在寻找更紧凑的代码,我想你可能会发现这个感兴趣的版本。