我是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
答案 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]
,情况已完全消失。您想要的东西可以分解为几个步骤:
i
串联起来组成一个值。我们可以将两者结合起来(如评论员所述)
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