伙计们,我有像这样的每小时温度数据
Lines <- "Date,Outdoor,Indoor
01/01 01:00:00,24.5,21.3
01/01 02:00:00,24.3,21.1
01/01 03:00:00,24.1,21.1
01/01 04:00:00,24.1,20.9
01/01 05:00:00,25.,21.
01/01 06:00:00,26.,21.
01/01 07:00:00,26.6,22.3
01/01 08:00:00,28.,24.
01/01 09:00:00,28.9,26.5
01/01 10:00:00,29.4,29
01/01 11:00:00,30.,32.
01/01 12:00:00,33.,35.
01/01 13:00:00,33.4,36
01/01 14:00:00,35.8,38
01/01 15:00:00,32.3,37
01/01 16:00:00,30.,34.
01/01 17:00:00,29.,33.
01/01 18:00:00,28.,32.
01/01 19:00:00,26.3,30
01/01 20:00:00,26.,28.
01/01 21:00:00,25.9,25
01/01 22:00:00,25.8,21.3
01/01 23:00:00,25.6,21.4
01/01 24:00:00,25.5,21.5
01/02 01:00:00,25.4,21.6
01/02 02:00:00,25.3,21.8"
我需要创建另一个列,如果室内高于室外高度至少1度则为1。
我试过了:
DF$Time = 0
if ((Indoor-Outdoor) >= 1) DF$Time = 1
但上述方法无效。有什么建议吗?
答案 0 :(得分:5)
你也可以将逻辑减少到一个布尔值:
#using mdsummer's DF object:
y <- with(DF, (Indoor - Outdoor >= 1) * 1)
x <- ifelse(test = (DF$Indoor - DF$Outdoor) >= 1, yes = 1, no = 0)
> all.equal(x,y)
[1] TRUE
答案 1 :(得分:1)
使用ifelse
进行矢量化比较,而不是使用if
进行单元素比较。
此外,首先你应该提供可重现的代码,但'Lines'只是一个字符向量,所以
DF <- read.table(textConnection(Lines), sep = ",", header = TRUE)
Time
可以直接添加为ifelse
的返回值,当比较为真时给出1,否则为0。
DF$Time <- ifelse(test = (DF$Indoor - DF$Outdoor) >= 1, yes = 1, no = 0)
有关if
需要单个元素的详细信息,请参阅帮助(控制):
cond:长度为1的逻辑向量,不是“NA”。条件 大于一的长度被警告接受,但仅限 第一个元素被使用。其他类型被强制执行 如果可能的话逻辑,忽略任何类。