按索引而不是名称引用列

ike*_*kel 1 for-loop r dataframe

背景

我有一个调查表如下

E313     B515       C515      ...   (more columns)
1122     John doe   I don't like the lesson
2211     Mary Jane  It was excellent
Run Code Online (Sandbox Code Playgroud)

调查提供者还提供了用于解码调查中的列的标签,如下 ( survey_data_map.csv):

Code    Label
E313    Unique Identifier
B515    Full name
C515    Feedback
.
.
.
(more rows)

Run Code Online (Sandbox Code Playgroud)

因此,我编写了一个小片段,将调查中的列解码为列标签。

survey_data_map <- read.csv("survey_data_map.csv")
for(i in 1:length(names(survey))) {
  
  label <- survey_data_map$Label[survey_data_map$Code == names(survey)[i]]
  if (length(label) > 0) {
    names(survey)[i] <- label  
  }
}
Run Code Online (Sandbox Code Playgroud)

问题

解码列名的列名survey_data_map.csv可能会改变。我的问题是如何重写 for 循环以使用列索引而不是使用列名CodeLabel

谢谢。

Kon*_*lph 5

一般来说,数据帧的列可以使用[[子集运算符来寻址。您可以使用数字索引或名称(作为字符串)来执行此操作:

\n
survey_data_map[[1L]] # same as\nsurvey_data_map[[\'Code\']]\n
Run Code Online (Sandbox Code Playgroud)\n

但是,请确保这是您实际应该做的!你写了:

\n
\n

如果提供者更改了列名怎么办?survey_data_map.csv

\n
\n

而 \xe2\x80\x99s 确实是一个合理的担忧!但是,至少如果发生这种情况,\xe2\x80\x99 可能会出现错误。相反,另一件经常发生的事情是有人对表的列重新排序。如果发生这种情况并且您使用列索引,您的代码将继续运行,但会产生错误的结果。

\n