我正在尝试为每个单独的ID标记“1”,“2”和“3”循环数据矩阵(请参阅底部的我的数据)。最后我这样做是为了使用ts()函数将X和Y坐标转换为时间序列,但首先我需要在函数中构建一个循环,为每个单独的ID返回一个时间序列。当我对数据帧使用以下代码时,循环本身可以正常工作:
for(i in 1:3){
print(na.omit(xyframe[ID==i,]))
}
返回以下输出:
Timestamp X Y ID
1. 0 -34.012 3.406 1
2. 100 -33.995 3.415 1
3. 200 -33.994 3.427 1
Timestamp X Y ID
4. 0 -34.093 3.476 2
5. 100 -34.145 3.492 2
6. 200 -34.195 3.506 2
Timestamp X Y ID
7. 0 -34.289 3.522 3
8. 100 -34.300 3.520 3
9. 200 -34.303 3.517 3
然而,当我想用相同的代码在矩阵中产生一个循环时:
for(i in 1:3){
print(na.omit(xymatrix[ID==i,])
}
它返回以下错误:
Error in print(na.omit(xymatrix[ID == i, ]) :
(subscript) logical subscript too long
为什么在对数据帧起作用的情况下将ID循环到矩阵不起作用,我怎样才能修复它? 此外,我读到循环需要更多的计算强度,然后做基于矢量的相同的事情,有没有办法做这个矢量为基础?
数据(简化实际数据):
Timestamp X Y ID
1. 0 -34.012 3.406 1
2. 100 -33.995 3.415 1
3. 200 -33.994 3.427 1
4. 0 -34.093 3.476 2
5. 100 -34.145 3.492 2
6. 200 -34.195 3.506 2
7. 0 -34.289 3.522 3
8. 100 -34.300 3.520 3
9. 200 -34.303 3.517 3
答案 0 :(得分:1)
格式xymatrix[ID==i,]
不适用于矩阵。试试这个:
for(i in 1:3){ print(na.omit(xymatrix[xymatrix[,'ID'] == i,])) }
答案 1 :(得分:1)
通常,如果您想将函数应用于数据框,拆分某个因素,那么您应该使用apply
之一函数族与split
结合使用。
这是一些可重复的样本数据。
n <- 20
some_data <- data.frame(
x = sample(c(1:5, NA), n, replace= TRUE),
y = sample(c(letters[1:5], NA), n, replace= TRUE),
id = gl(3, 1, length = n)
)
如果你想打印出没有缺失值的行,按每个ID级别进行拆分,那么你需要这样的东西。
lapply(split(some_data, some_data$grp), na.omit)
或更简洁地使用plyr
包。
library(plyr)
dlply(some_data, .(grp), na.omit)
两种方法都像这样返回输出
# $`1`
# x y grp
# 1 2 d 1
# 4 3 e 1
# 7 3 c 1
# 10 4 a 1
# 13 2 e 1
# 16 3 a 1
# 19 1 d 1
# $`2`
# x y grp
# 2 1 e 2
# 5 3 e 2
# 8 3 b 2
# $`3`
# x y grp
# 6 3 c 3
# 9 5 a 3
# 12 2 c 3
# 15 2 d 3
# 18 4 a 3