2016-06-24 2 views
0

у меня есть кадр данныхНе удается прочитать правильно тип значения dataframe элементов

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, и я не знаю, что происходит.

В случае я использую в for-loopprint(SSIM_BEST$X3[[j]]) я получаю что-то вроде:

[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 здесь, например, для целей.

Вы можете мне помочь?

+2

Зачем нужен цикл? 'SSIM_BEST [c (TRUE, FALSE)," X3 "]' – zx8754

+0

@ zx8754 В моем коде я использую цикл, потому что у меня есть шаг 'by = 21' в' for loop() '. – zinon

+0

Является ли SSIM_BEST $ X3 фактором? Вот почему вы получили эти странные значения. Если это не так, попробуйте 'nrow (SSIM_BEST)' вместо 'dim (SSIM_BEST) [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.

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 
+0

Спасибо, вот и все. Я также должен использовать 'strAsAsFactors = FALSE' при создании data.frame(). – zinon

+1

Растущие вещи в цикле, как правило, плохая идея в Р. Я не читал вопрос тщательно, но я уверен, что есть способ избежать этого. – Frank

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"] 
Смежные вопросы