2015-06-12 4 views
1

Я пытаюсь написать функцию R, которая будет вызывать строку для последующего вывода. Данные поступают в кадр данных с одним столбцом и именами ростов.Почему R возвращает целое число вместо строки

fcc <- structure(list(temp = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 1L, 3L, 3L, 3L, 4L, 3L, 3L, 3L, 3L, 3L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 4L, 3L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
4L, 4L, 1L, 3L, 3L, 4L, 4L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L 
), .Label = c("H", "M", "N", "S"), class = "factor")), 
.Names = "temp", row.names = 
    c(NA, 135L), class = c("tbl_df", "tbl", "data.frame")) 

outStr <- "name" 
for(i in 1:nrow(fcc)){ 
if (fcc[i,] != "N"){ 
    outStr <- paste0(outStr," ", rownames(fcc)[i],"(",fcc[i,],")") 
} 
} 

Вместо символов «H», «M» и т. Д., Которые я ожидаю, R возвращает 1,2 и т. Д.

Когда я набираю в ГЦК [I] в командной строке можно увидеть символ Мне нужно:

> fcc[1,] 
Source: local data frame [1 x 1] 

    temp 
    1 N 

Я довольно уверен, что это меня недоразумение факторов, но я не могу понять это.

Спасибо! Мэтт

ответ

4

Фактически, ваш объект не является «обычным» data.frame. Это tbl_df, вероятно, созданный с dplyr. Похоже, этот класс имеет разные правила подмножества. С нормальными data.frames, когда вы подмножество и только один столбец возвращается, результат преобразуется в вектор.

Посмотрите на разницу, когда вы Подмножество tbl_df объект и стандартный data.frame

fcc2 <- as.data.frame(fcc) 
str(fcc[1,]) 
# Classes ‘tbl_df’ and 'data.frame': 1 obs. of 1 variable: 
# $ temp: Factor w/ 4 levels "H","M","N","S": 3 
str(fcc2[1,]) 
# Factor w/ 4 levels "H","M","N","S": 3 
str(fcc2[1,, drop=F]) 
# 'data.frame': 1 obs. of 1 variable: 
# $ temp: Factor w/ 4 levels "H","M","N","S": 3 

Как обсуждалось на странице ?paste справки, значения преобразуются в символы с помощью as.character. В конечном итоге, похоже, вы пытаетесь преобразовать через as.vector(, mode="character"), что является тем, что меняет ваше значение на версии символов числового индекса.

as.vector(fcc[1,1], "character") 
# [1] "3" 
as.vector(fcc2[1,1], "character") 
# [1] "N" 

Обратите внимание, что ваш взгляд действительно не нужен, вы можете индексировать/подмножать/свернуть все в векторизованных операциях.

paste(paste0(seq_along(fcc[[1]]), "(", fcc[[1]] , ")")[fcc[[1]]!="N"], collapse=" ") 

Здесь мы используем [[ ]] извлечь коэффициент вектора из tbl_df объекта так склеивание работает намного лучше.

Смежные вопросы