假设我有一个数据框
DF1:
Y1 Y2 Y3
1 1-5 6-10 11-15 #age-groups
2 3 2 2 #number of people per age-group
DF2:
ID Age-Group
1 NA
2 NA
3 NA
4 NA
5 NA
6 NA
7 NA
我希望在DF2的Age-Group列中添加DF1中的数据:
DF2:
ID Age-Group
1 1-5
2 1-5
3 1-5
4 6-10
5 6-10
6 11-15
7 11-15
到目前为止,我有一个循环:
for (i in 1:3) #number of columns in DF1
{number=DF1[2,i] #stores the number of times Age-Group 1-5 is repeated (3)
DF2[1:number,2]=DF1[1,i] #attach the 1-5 label to the first 3 cells
此循环适用于应用第一个年龄组1-5,但当我移动到下一个标签时,6-10 ...如何从第4行开始填充2个空单元格?截至目前,循环将始终从第1行开始。我的数据帧远大于此,这就是循环更好的原因。
答案 0 :(得分:2)
首先我假设df1的列不是因素。一种巧妙的方法是使用:
df1[] <- lapply(df1, as.character)
您可以使用函数rep()。重要的是要注意rep()接受向量作为它的第一个和第二个参数的输入,因此这里不需要for循环。代替:
df2[, 1] <- unlist(rep(df1[1, ], df1[2, ]))
在这里,我们告诉rep()重复第一个年龄组&#34; 1-5&#34; 3次,&#34; 6-10&#34; rep()的输出将是一个列表,因此可以使用unlist()进行转换 列表到矢量。
答案 1 :(得分:-1)
我认为斯科特的答案是最好的。这是一种明确使用for循环的方法:
a=data.frame()
for (i in 1:nrow(t(DF1)))
{
b<-data.frame(AGE=rep(t(DF1)[i,1],(as.numeric(t(DF1)[i,2]))))
a<-rbind(a,b)
}