在变量名称上创建循环

Creating a loop over variables' names

我是 R 的新手(几天前开始)并且来自 STATA。当变量的值为 -9 时,我正在尝试创建一个循环来创建虚拟变量。我想使用循环,因为我有很多这样的变量。

在下面,reflex_working 是我的数据框,"A7LECTUR" 等是我的变量。我正在尝试使用 ifelse 函数为每个变量创建一个名为 "miss_varname" 的虚拟对象。

varlist<-c("A7LECTUR", "A7GROASG", "A7RESPRJ", "A7WORPLC", "A7PRACTI", 
"A7THEORI", "A7TEACHR", "A7PROBAL", "A7WRIASG", "A7ORALPR")

for (i in varlist){
    reflex_working$miss_[i]<-ifelse(reflex_working$i==-9,1,0)
    } 

每次迭代我都会收到以下警告:

1: Unknown or uninitialised column: 'miss_'.
2: Unknown or uninitialised column: 'i'.

并且没有创建变量。我想这对每个人来说都是微不足道的事情,但我在过去一个小时里一直在尝试创建这种循环,结果显示为零。

编辑: 我有类似的东西:

A7LECTUR
1
2
1
4
-9    

并希望在循环之后有一个新列,如:

reflex_working$miss_A7LECTUR
0
0
0
0
1

希望这有助于阐明我想要实现的目标! 任何帮助将不胜感激。

加布里埃尔

假设您希望对整个数据框使用此方法。

tt <- read.table(text="
A7LECTUR A7GROASG
1        2
2        3
1        -9
4        -9
-9       0", header=TRUE)

tt.d <- (tt == -9)*1
colnames(tt.d) <- paste0("miss_", colnames(tt))
tt.d
#      miss_A7LECTUR miss_A7GROASG
# [1,]             0             0
# [2,]             0             0
# [3,]             0             1
# [4,]             0             1
# [5,]             1             0

让我们来分析一下为什么它不起作用。对于初学者,在 R

i
A7LECTUR 
# and
"A7LECTUR"

不一样。前两个是variablenames,后一个是value。我强调这个区别,因为这是一个重要的区别。

使用列表(和数据框,因为数据框基本上是列表,有一些限制使它们成为矩形),语法reflex_working$i reflex_working 指的是变量, i 指的是列表中名为 "i" 的元素。在 reflex_working$i 中,i 文字 并且 R 不关心您是否有一个名为 i.

的变量

对于编程,我们希望更加动态。因此,您正确地假设使用变量可以解决问题。如果你想这样做,你必须使用 [[[ 子集方法([ always returns 一个列表,而 [[ 将 return 没有封装列表的元素 [1]).

总结一下:

reflex_working$i    # gets the element named i, no matter what.
reflex_working[[i]] # gets the element whose name (or position) is stored in the variable i
reflex_working$i == reflex_working[["i"]]

这应该可以解释循环中你的行的 right-hand-side。正确的说法应该是

ifelse(reflex_working[[i]]==-9,1,0)

对于left-hand-side、reflex_working$miss_[i],事情就完全结束了。你想要的可以分解成几个步骤:

  1. 通过连接 "miss_" 和 i 的值组成一个值。
  2. 使用该值作为 element/column 名称。

我们可以将这两个组合成(如评论者所述)

reflex_working[[paste0('miss_', i)]] <- ...

你干得好,认识到 R 本质上是矢量化的——因为你没有为列中的每一行编写循环。好一个!


[1] 但 [[ 可以 return 一个列表,如果元素本身是一个列表。 R可以...古怪充满惊喜