在变量名称上创建循环

时间:2019-07-19 10:27:28

标签: r loops dummy-variable

我是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

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

Gabriele

2 个答案:

答案 0 :(得分:2)

我们将其分解为为什么不起作用。对于初学者,在R

i
A7LECTUR 
# and
"A7LECTUR"

是不同的。前两个是变量名称,后一个是。我强调这种区别,因为这是一个重要的区别。

使用列表(和数据框,因为数据框基本上是具有限制的矩形列表,使其成为矩形),在语法reflex_working$i reflex_working中指代变量i是指列表中名为“ i”的元素。在reflex_working$i中,i literal ,R不在乎是否有一个名为i的变量。

通过编程,我们希望变得更有活力。因此,您正确地假设使用变量可以解决问题。如果要这样做,则必须使用[[[子集方法({[ 总是返回一个列表,而[[将返回没有封装列表的元素[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"]]

这应该解释循环中行的右侧。正确的声明应为

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

对于左侧reflex_working$miss_[i],情况已完全消失。您想要的东西可以分解为几个步骤:

  1. 通过将“ miss_”和值i串联起来组成一个值。
  2. 使用该值作为元素/列名称。

我们可以将两者结合起来(如评论员所述)

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

您很高兴,因为您意识到R本质上是矢量化的-因为您没有为列中的每一行编写循环。好人!


[1],但是[[可以返回列表,如果元素本身是列​​表。 R可能会...充满惊喜。奇怪

答案 1 :(得分:0)

假设您希望在整个数据框中使用此功能。

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