R在()的操作和逻辑顺序内

时间:2015-10-12 19:53:57

标签: r logic

我试图理解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

2 个答案:

答案 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

要理解D2D没有提供预期输出的原因时,请尝试按照@ sebastian-c的建议使用browser()或按照说明的步骤逐步检查对象在他的回答中。

在OP的情况下,使用rep进行初始化然后进行多次替换是一种选择。另一种方法是使用cut,它用于为有序数据的间隔分配标签。