我试图理解R“中的within()函数是如何工作的。”例如,在下面的代码中,我尝试根据条件创建一个名为“FEELS”的新变量。 within()函数的前两个用法不起作用。内部()函数的第三次使用有效,但我不相信我理解“为什么”它的工作原理。任何帮助表示赞赏。
DF <- data.frame(DATE = seq(as.Date("2015-01-01"), as.Date("2015-12-31"), "month"), TEMP = c(30, 40, 50, 60, 70, 80, 90, 100, 90, 80, 70, 60))
DF <- within(DF, {
FEELS[30 <= TEMP & TEMP <= 50] <- "Cold"
FEELS[60 <= TEMP & TEMP <= 70] <- "Good"
FEELS[80 <= TEMP & TEMP <= 100] <- "Hot"
})
DF <- within(DF, {
FEELS <- "Cold"
FEELS[60 <= TEMP & TEMP <= 70] <- "Good"
FEELS[80 <= TEMP & TEMP <= 100] <- "Hot"
})
DF
DF <- within(DF, {
FEELS <- NA
FEELS[60 <= TEMP & TEMP <= 70] <- "Good"
FEELS[80 <= TEMP & TEMP <= 100] <- "Hot"
FEELS[is.na(FEELS)] <- "Cold"
})
DF
答案 0 :(得分:4)
让我们逐一打破这些。
1。这只会导致错误消息:
Error in FEELS[30 <= TEMP & TEMP <= 50] <- "Cold" : object 'FEELS' not found
这很有道理。您尚未定义FEELS
,因此对其进行分组会导致错误。
2。这个很有趣,如果你在'内'之外做的话可以更清楚地看到
FEELS <- "cold"
tf <- 60 <= DF$TEMP & DF$TEMP <= 70
tf
[1] FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
FEELS[tf] <- "Good"
FEELS
[1] "cold" NA NA "Good" "Good" NA NA NA NA NA "Good"
[12] "Good"
R以长度为1的向量开始,包含“冷”,但是您的子集强制它扩展并在其TRUE
的所有元素中放置“好”。对于FALSE
的所有内容,R没有任何值,因此将NA放在那里。
3。最后一个非常简单。你从一个NA向量开始,它以与2中的向量相同的方式扩展。然后用“冷”替换所有留下的NA。
答案 1 :(得分:4)
在within(DF, {...})
内创建对象时,它不会自动与DF
列的长度相同。相反,它将在{...}
结束时“回收”以填写列
within(data.frame(A=1:6), { B = 1; C = 1:2 })
# A C B
# 1 1 1 1
# 2 2 2 1
# 3 3 1 1
# 4 4 2 1
# 5 5 1 1
# 6 6 2 1
如果在{...}
结束之前,您希望将对象修改为完整列,则它必须具有正确的长度:
within(data.frame(A=1:6), {
D = 1
D[ A < 3 ] = 0
D2 = rep(1, length(A))
D2[A < 3 ] = 0
})
# A D2 D
# 1 1 0 0
# 2 2 0 0
# 3 3 1 NA
# 4 4 1 NA
# 5 5 1 NA
# 6 6 1 NA
要理解D2
在D
没有提供预期输出的原因时,请尝试按照@ sebastian-c的建议使用browser()
或按照说明的步骤逐步检查对象在他的回答中。
在OP的情况下,使用rep
进行初始化然后进行多次替换是一种选择。另一种方法是使用cut
,它用于为有序数据的间隔分配标签。