为什么R返回整数而不是字符串

时间:2015-06-12 22:03:47

标签: r

我正在尝试编写一个R函数,它将生成一个字符串以供以后输出。数据来自一个包含一列和rownames的数据框。

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,等等。

当我在命令提示符下键入fcc [i]时,我可以看到我需要的字符:

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

  temp
  1    N

我很确定这是我误解的因素,但我无法弄清楚。

谢谢! 马特

1 个答案:

答案 0 :(得分:4)

实际上你的目标不是常规的&#34; 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对象中提取因子向量,这样粘贴效果会更好。