在变量名称上创建循环
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]
,事情就完全结束了。你想要的可以分解成几个步骤:
- 通过连接 "miss_" 和
i
的值组成一个值。
- 使用该值作为 element/column 名称。
我们可以将这两个组合成(如评论者所述)
reflex_working[[paste0('miss_', i)]] <- ...
你干得好,认识到 R 本质上是矢量化的——因为你没有为列中的每一行编写循环。好一个!
[1] 但 [[
可以 return 一个列表,如果元素本身是一个列表。 R可以...古怪充满惊喜
我是 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]
,事情就完全结束了。你想要的可以分解成几个步骤:
- 通过连接 "miss_" 和
i
的值组成一个值。 - 使用该值作为 element/column 名称。
我们可以将这两个组合成(如评论者所述)
reflex_working[[paste0('miss_', i)]] <- ...
你干得好,认识到 R 本质上是矢量化的——因为你没有为列中的每一行编写循环。好一个!
[1] 但 [[
可以 return 一个列表,如果元素本身是一个列表。 R可以...古怪充满惊喜