【问题标题】:Concatenate quotes with a string in a loop in R在R中的循环中将引号与字符串连接起来
【发布时间】:2015-02-17 20:26:07
【问题描述】:

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

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,]) }
}

【问题讨论】:

  • 你认为的字符串实际上是一个因素。在使用粘贴之前,您必须先将其转换为字符串。您应该提供对象“items”和“x”是什么。
  • 进一步@CactusWoman 的评论:(1)尝试items[i,] = paste("\"", as.character(items[i,]), "\"", sep = ""); (2) 否则,如果不更好地了解您的数据是什么样子,我们将无法为您提供帮助。
  • 你应该提供几行item和x,尝试向我们展示head(items)和head(x)的结果
  • 更好的是,告诉我们dput(head(items))dput(x)
  • 如果您在循环之前运行items&lt;-as.character(items),它应该可以正常工作,如果新元素尚未在级别中,则无法将新元素添加到类型因子列中,因此您必须转换@ 987654328@ 重新分配其元素之前的字符。

标签: r string concatenation


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,r2evans!
  • 我将第二行保留为初始状态:items[i,] = paste("\"", items[i,], "\"", sep = "")。我只在循环之前添加了items[,1] &lt;- as.character(items[,1])(在我的原始代码中)。再次感谢!现在我的代码可以工作了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
相关资源
最近更新 更多