【发布时间】:2016-04-28 07:22:24
【问题描述】:
我有一个 184 obs 的数据框。 5 个变量:
'data.frame': 184 obs. of 5 variables:
$ Cat : Factor w/ 10 levels "99-001","99-002",..: 1 1 1 1 1 1 1 1 1 1 ...
$ No : int 1 1 1 1 1 1 1 1 1 1 ...
$ ehs : int 0 0 0 0 0 0 0 0 0 0 ...
$ Onset : int 0 0 0 0 0 0 0 9 9 9 ...
$ STARTING: Factor w/ 149 levels "1:37PM1","1:42PM1",..: 3 4 5 63 64 65 66 67...
数据框来自重复测量研究,这意味着每个案例都被测量了多次:
现在我想通过判断每个病例的发病情况来创建一个新的变量(provoke)。如果起始是“0”,那么新变量(provoke)将被编码为“0”,否则为“1”。
我的 R 脚本:
no1 <- seq[seq$No == 1, ]
if (no1[1,4]==0) {no1$provoke =0} else {no1$provoke =1}
no2 <- seq[seq$No == 2, ]
if (no2[1,4]==0) {no2$provoke = 0} else {no2$provoke = 1}
对于较大的案例数,我打算写一个循环来完成任务
for (i in 1:10) {
noi <- seq[seq$No == i, ]
if (noi[1,4]==0) {
noi$provoke = 0}
else {noi$provoke = 1}
}
但循环似乎不起作用。你能帮我找出错误或指出我的错误吗?
【问题讨论】:
-
noi应该是no[i]和noi[1,4]应该是no[i,4]。无论哪种方式,当您在控制台中键入以下内容时,您会很好地阅读获得的帮助页面:?`[` -
当然,您根本不应该为此使用
for循环。矢量化解决方案要快得多。 -
在黑暗中拍摄(没有可重复的数据),但这里有一个解决方案:
df$provoke <- sapply(1:nrow(df), function(x) ifelse(df[x,"Onset"]==0, 0, 1) -
seq$provoke <- ave(seq$Onset, seq$No, FUN = function(x){as.numeric(x[1] != 0)})如果我没看错的话......
标签: r loops if-statement for-loop dataframe