R:在变量名中使用占位符/计数器执行循环

R:在变量名中使用占位符/计数器执行循环,r,loops,while-loop,R,Loops,While Loop,我最近刚从斯塔塔搬到R。我很兴奋,但显然现在面临着所有这些适应R及其工作方式的初期问题 在我的工作中,我也一直在使用STATA进行数据清理。现在我打算对R做同样的事情。我们使用问卷收集了大量的原始数据(家庭层面的数据)。数据集相当大,通常由许多不同的网格组成(例如,家庭网格,我们为每个家庭成员重复了许多问题,如您的姓名、年龄、教育程度等)。所以你可能会问这样的问题 Q3_姓名_1(家庭成员1的姓名) Q3_年龄_1(家庭成员1的年龄) 第三季度教育1(家庭成员1的教育) 数据帧的结构大致如下所示

我最近刚从斯塔塔搬到R。我很兴奋,但显然现在面临着所有这些适应R及其工作方式的初期问题

在我的工作中,我也一直在使用STATA进行数据清理。现在我打算对R做同样的事情。我们使用问卷收集了大量的原始数据(家庭层面的数据)。数据集相当大,通常由许多不同的网格组成(例如,家庭网格,我们为每个家庭成员重复了许多问题,如您的姓名、年龄、教育程度等)。所以你可能会问这样的问题 Q3_姓名_1(家庭成员1的姓名) Q3_年龄_1(家庭成员1的年龄) 第三季度教育1(家庭成员1的教育)

数据帧的结构大致如下所示:

df <- data.frame(ID=c(1, 2, 3,4), Q3_A_1=c(1, 3, 2, 5), 
                 Q3_Age_2=c(1, 4, 2, "Refused"), 
                 Q3_Age_3=c(1, 9, 2, 4), 
                 Q3_Age_4=c(1,11, "Don't know", 5), stringsAsFactors=F)
i<-1; while(i<=11){
w3$Q3Age_i<-as.character(w3$Q3Age_i)
   w3$Q3Age_i[w3$Q3Age_i == "Refused" | w3$Q3Age_i == "Don't Know"] <-   "NA"
   w3$Q3Age_i<-as.numeric(w3$Q3Age_i)
   i<-i+1
}

df您给出的示例不需要循环作为R向量化操作。如果我们制作一些虚拟数据:

df = data.frame(ID=c(1, 2, 3, 4),
                Q3_Age_1=c(1, 3, 2, 5), 
                Q3_Age_2=c(1, 4, 2, "Refused"), 
                Q3_Age_3=c(1, 9, 2, 4), 
                Q3_Age_4=c(1, 11, "Don't know", 5),
                stringsAsFactors=F)
然后我们可以更改一列:

df$ans[df$Q3_Age_2 == "Refused"] = NA
考虑到当前的数据结构,这并不理想

您可以使用
重塑2
包()将数据从宽转换为长:

library(reshape2)
df = melt(df, id.vars="ID")
这意味着您现在可以更轻松地操作“答案”列

然而,如果您想做更复杂的事情并且确实需要一个循环,我认为更好地定义索引列是关键

获取索引列:

x = strsplit(df$ind, "_")
x = do.call("rbind.data.frame", x)
colnames(x) = c("Question", "Household", "Respondent")
df = cbind(x, df)
迭代您的数据:

# Note lapply returns a list
lapply(unique(df$Respondent), function(i){
    x = df[df$Respondent, ] = i
    # Do what you need to x, your subset of df
    # Make sure your last line returns your result
})
您还可以从
dplyr
软件包中查看
groupby


最后,看看如何制作一个可重复的示例(),因为我怀疑您的数据结构非常奇怪(可能最好存储在列表中)

研究如何使用
apply
函数。您应该给出一个数据示例(例如通过
dput(w3)
的输出),并说明所需的输出。我开始编写答案,但我认为您的数据可能就是问题所在。如果您的数据采用经典的数据库格式,例如
问题
家庭
受访者
,则解决问题会容易得多,这些数据组合起来将形成一个唯一的ID。我将在此基础上整理一些内容。感谢大家提供的第一个提示。我仍然有点困惑,但将研究第一个建议。我编辑了我的第一个问题,以包括数据框结构的示例。我希望这能让事情变得更清楚,谢谢。你可以使用
apply
在列上循环,但我仍然认为你最好将数据转换成标准的数据库长格式,例如..谢谢Mike。我没有指出的是,我想对一组不同的变量(数据框中的不同列)进行更改。这些不同的列都有相同的变量名,但末尾有一个计数器。我编辑了您的第一个示例,以便更清楚地了解我的数据的结构。我希望这能让事情变得更清楚。你还会像第二个例子那样继续吗?提前谢谢!我的建议是看看不同的数据结构,因为我认为这就是问题所在。根据我所掌握的信息,我会有两个索引栏(住户和受访者),然后是问题栏,因为每个问题可能有不同的数据类型。谢谢你的提示。我会马上调查的。顺便说一句,我解决了我的问题如下:我
# Note lapply returns a list
lapply(unique(df$Respondent), function(i){
    x = df[df$Respondent, ] = i
    # Do what you need to x, your subset of df
    # Make sure your last line returns your result
})