在 R 中的循环中将引号与字符串连接起来

Concatenate quotes with a string in a loop in R

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

1: In [<-.factor(*tmp*, iseq, value = "\"Lorem ipsum dolor sit amet.\"") : invalid factor level, NA generated.

这里有什么问题?

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

问题是你的专栏是 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

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

问题是 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 化的列中,您必须 (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;

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