1

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

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

加布里埃尔

4

2 回答 2

3

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

i
A7LECTUR 
# and
"A7LECTUR"

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

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

通过编程,我们希望更有活力。因此,您正确地假设使用变量可以解决问题。如果你想这样做,你必须使用[or[[子集方法([ 总是返回一个列表,而[[将返回没有封装列表 [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 可以是……充满惊喜的怪异。

于 2019-07-19T11:11:12.750 回答
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
于 2019-07-19T10:59:10.743 回答