我有一个数据框
SSIM_BEST=
X1 X2 X3 X4 X5
1 1 36 0.939323 B4 ON
2 1 35 0.943645 B2 ON
3 1 34 0.948516 B2 ON
4 1 33 0.952599 ZL ON
5 1 32 0.956492 ZL ON
6 1 31 0.960432 ZL ON
7 1 30 0.963957 ZL ON
8 1 29 0.96664 ZL ON
9 1 28 0.969612 ZL ON
10 1 27 0.97234 ZL ON
11 1 26 0.97478 ZL ON
12 1 25 0.977332 ZL ON
13 1 24 0.979606 ZL ON
14 1 23 0.981423 ZL ON
15 1 22 0.983776 ZL ON
我有循环来读取X3
列中的一些值,例如:
SSIM=c()
for (j in seq(1,dim(SSIM_BEST)[1], by=2)) {
SSIM= c(SSIM, SSIM_BEST$X3[[j]]))
}
我没有获得0.939323,0.948516...
这样的值,而是获得SSIM=20 27 33 39 44 52 56 61
,而我不知道发生了什么。
如果我在print(SSIM_BEST$X3[[j]])
中使用for-loop
,我会得到类似的内容:
[1] 0.939323
72 Levels: 0.894559 0.899583 0.901154 0.907706 0.914609 0.914673 0.91996 0.920569 0.922076 0.925761 0.925897 0.926495 0.928728 0.931108 ... 0.992964
P.S。 SSIM_BEST
包含超过15行。我出于示例目的在这里显示了15个。
你能帮我吗?
答案 0 :(得分:2)
我们可以为子集创建TRUE / FALSE向量。
# data
SSIM_BEST <- read.table(text ="
X1 X2 X3 X4 X5
1 1 36 0.939323 B4 ON
2 1 35 0.943645 B2 ON
3 1 34 0.948516 B2 ON
4 1 33 0.952599 ZL ON
5 1 32 0.956492 ZL ON
6 1 31 0.960432 ZL ON
7 1 30 0.963957 ZL ON
8 1 29 0.96664 ZL ON
9 1 28 0.969612 ZL ON
10 1 27 0.97234 ZL ON
11 1 26 0.97478 ZL ON
12 1 25 0.977332 ZL ON
13 1 24 0.979606 ZL ON
14 1 23 0.981423 ZL ON
15 1 22 0.983776 ZL ON", header = TRUE)
# get odd rows
SSIM_BEST[c(TRUE, FALSE), "X3"]
# more generic solution
mySkip = 2
SSIM_BEST[seq(nrow(SSIM_BEST)) %% mySkip == 1, "X3"]
答案 1 :(得分:0)
我认为这是因为SSIM_BEST $ X3是一个因素。我愿意打赌你从for循环得到的值是因素的水平。
我有两个选项可以兼顾。
SSIM=c()
SSIM_BEST$X3 <- as.numeric(SSIM_BEST$X3)
for (j in seq(1,dim(SSIM_BEST)[1], by=2)) {
SSIM= c(SSIM, SSIM_BEST$X3[[j]]))
}
或者
SSIM=c()
for (j in seq(1,dim(SSIM_BEST)[1], by=2)) {
SSIM= c(SSIM, as.numeric(SSIM_BEST$X3[[j]])))
}
正如弗兰克所说,for循环并不好。我编写了一个简单的函数,可以在没有for
循环的情况下执行您想要的操作。
getDat <- function(data,by=2,start=1) {
v <- (1:length(data) %% by == 1)
if(start > 1){
v <- c(v,rep(F,start-1))
v <- shift(v,start-1)
is.na(v) <- FALSE
v <- v[1:(length(v) - (start-1))]
}
data <- data[v]
data[!is.na(data)]
}
这也允许您指定向量中的起始位置。
x <- 1:50
getDat(x,2)
[1] 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
getDat(x,2,2)
[1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50
getDat(x,3,10)
[1] 10 13 16 19 22 25 28 31 34 37 40 43 46 49