我正在尝试编写一个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
我很确定这是我误解的因素,但我无法弄清楚。
谢谢! 马特
答案 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
对象中提取因子向量,这样粘贴效果会更好。