在R中的循环中使用字符串连接引号

时间:2015-02-17 20:26:07

标签: r string concatenation

我想在循环中将引号与字符串连接起来。我尝试使用下面的代码,但这只会产生一个警告:

  

1:在[<-.factor*tmp*,iseq,value =“\”Lorem ipsum dolor sit   amet。\“”):无效因子水平,NA生成。

这里有什么问题?

for(i in 1:length(x)){
        if(i < length(x)){
            print(paste("\"", items[i,], "\"", sep = ""))
        } else { print(items[i,]) }
}

1 个答案:

答案 0 :(得分:3)

问题是您的专栏是factor

items <- structure(list(V1 = structure(c(4L, 3L, 1L, 2L, 5L, 6L),
                            .Label = c("Am f?cut multe din lucrurile pe care mi le-am dorit.", 
                                "Am sentimente calde fa?? de ceilal?i.", "Nu sunt interesat de al?i oameni. (I) ", 
                                "Nu sunt mul?umit de felul în care sunt. (I)", "Rareori m? trezesc odihnit. (I)", 
                                "Sunt pesimist în leg?tur? cu viitorul. (I)"),
                            class = "factor")),
                   .Names = "V1",
                   row.names = c(NA, -6L),
                   class = "data.frame")
x <- structure(list(SSB1 = c(6L, 6L, 6L, 6L, 6L, 3L),
                    SSB2 = c(5L, 6L, 5L, 6L, 6L, 1L),
                    SSB3 = c(5L, 4L, 4L, 6L, 6L, 5L),
                    SSB4 = c(6L, 4L, 5L, 6L, 6L, 6L),
                    SSB5 = c(5L, 1L, 4L, 5L, 3L, 4L),
                    SSB6 = c(6L, 3L, 6L, 6L, 2L, 2L),
                    SSB7 = c(4L, 1L, 2L, 4L, 3L, 2L),
                    SSB8 = c(5L, 4L, 4L, 6L, 5L, 6L),
                    SSB9 = c(6L, 4L, 6L, 6L, 4L, 4L),
                    SSB10 = c(6L, 5L, 6L, 1L, 4L, 4L)),
               .Names = c("SSB1", "SSB2", "SSB3", "SSB4", "SSB5",
                   "SSB6", "SSB7", "SSB8", "SSB9", "SSB10"),
               class = "data.frame",
               row.names = c("1", "2", "3", "4", "5", "6"))

class(items[,1])
## [1] "factor"
paste("\"", items[1,], "\"", sep = "")
## [1] "\"Nu sunt mul?umit de felul în care sunt. (I)\""

简单的paste函数运行正常,但是当您尝试将其分配回同一行时(您应该更明确,顺便说一下,使用item[i,1]而不仅仅是item[i,] ,特别是如果你打算折叠字符串):

items[1,] <- paste("\"", items[1,], "\"", sep = "")
## Warning in `[<-.factor`(`*tmp*`, iseq, value = "\"Nu sunt mul?umit de felul în care sunt. (I)\"") :
##   invalid factor level, NA generated

NB 我们需要重新加载项目,因为我们刚刚损坏了第一行。

问题是paste命令产生的字符串不会被识别为因子级别之一。

levels(items[,1])
## [1] "Am f?cut multe din lucrurile pe care mi le-am dorit."
## [2] "Am sentimente calde fa?? de ceilal?i."               
## [3] "Nu sunt interesat de al?i oameni. (I) "              
## [4] "Nu sunt mul?umit de felul în care sunt. (I)"         
## [5] "Rareori m? trezesc odihnit. (I)"                     
## [6] "Sunt pesimist în leg?tur? cu viitorul. (I)"          

paste("\"", items[1,], "\"", sep = "")
## [1] "\"Nu sunt mul?umit de felul în care sunt. (I)\""

为了将任意字符串分配到此factor - ized列中,您必须(a)确保您指定的字符串与定义的级别之一相同,(b)将级别添加到用于说明新字符串的列(可能效率不高,也不想做什么),或者(c)在开始此操作之前将整列转换为character。前两个是低效的,(IMO)是不必要的,但如果我误解了你的需求,请告诉我。

对于(c):

items[,1] <- as.character(items[,1])
items[1,] <- paste("\"", items[1,], "\"", sep = "")
items
##                                                     V1
## 1        "Nu sunt mul?umit de felul în care sunt. (I)"
## 2               Nu sunt interesat de al?i oameni. (I) 
## 3 Am f?cut multe din lucrurile pe care mi le-am dorit.
## 4                Am sentimente calde fa?? de ceilal?i.
## 5                      Rareori m? trezesc odihnit. (I)
## 6           Sunt pesimist în leg?tur? cu viitorul. (I)

TL; DR;

在使用粘贴之前,您必须先将(您的列)转换为字符串。