在R中连接两个字符串变量

8

我看到很多关于在r中使用paste和paste0来连接两个字符串的讨论。然而,这似乎不适用于两个字符串变量。我有一个数据框,看起来像下面这样。

    series_id   year    period  value   footnote_codes
1   LASBS260000000000003            1983    M01 15.1              
2   LASBS260000000000003            1983    M02 15.0              
3   LASBS260000000000003            1983    M03 14.8              
4   LASBS260000000000003            1983    M04 14.6

我希望将年份变量和期间变量合并成一个新的变量,命名为observation,并将其添加到数据框中。数据框名称为data。我尝试了以下类似问题的粘贴命令:

data$obs<-paste0(toString(data$year),toString(data$period))
data$obs<-paste(toString(data$year),toString(data$period),sep="")

这并没有给我期望的单个变量取值"1983M01",请问您有什么想法吗?
Steve

5
它给你什么替代品? - A5C1D2H2I1M1N2O1R2T1
3
为什么你在使用toString?你有没有查看过调用paste之前的这些值? - Rich Scriven
安达,我就怕有人问我这个问题。我不确定我得到了什么。数据集非常庞大,即使我使用子集(7,000 obs)进行实验,处理时间仍然很长。我似乎得到了两组逗号分隔的变量,一组是年份,另一组是月份。我调用了class(data$obs),但它一直在旋转。无论我得到了什么都会占用我的内存。 - Steven Miller
Richard,我正在从toString语句中获取字符向量。年份本质上是一个整数,而期间是一个因子。我怀疑因子会被视为字符串,但我不确定。 - Steven Miller
当我的列不是我认为的那样时,例如合作者意外用另一个数据框架替换了数据框架中的“列”,我遇到了类似的奇怪行为。不用说,这导致了意想不到的行为。 - shadowtalker
你是否也尝试过嵌套粘贴调用而不是toString? - shadowtalker
2个回答

7
我遇到了上述问题:我想将“year”(数字)与字符串变量连接起来。我的解决方案是,使用“as.character”而不是“toString”,然后使用“paste0”连接变量。这对我有用。例如,
df$c <- paste0(as.character(df$a), " ", as.character(df$b))
我知道这是一个旧帖子,希望这能帮助其他处于类似情况的用户。

3
你的as.character是不必要的,例如,paste0(1:3, c("a", "b", "c"))可以完美地工作。 - Gregor Thomas
3
此处的 paste0 的用意是快速地插入空格。插入空格是 paste() 函数的默认行为,所以如果想要在术语之间插入空格,可以使用 paste(1:3, c("a", "b", "c")) 并让其默认工作。或者在你的情况下,可以使用 df$c <- paste(df$a, df$b) - Gregor Thomas

1
以下工作:

> apply(ddf,1 ,function(x) paste0(toString(x[2]), toString(x[3])))
[1] "1983M01" "1983M02" "1983M03" "1983M04"
> 
> apply(ddf,1 ,function(x) paste(toString(x[2]), toString(x[3])))
[1] "1983 M01" "1983 M02" "1983 M03" "1983 M04"

toString(ddf$year)将整个列绑定为一个字符串:

> toString(ddf$year)
[1] "1983, 1983, 1983, 1983"
> 
> toString(ddf$period)
[1] "M01, M02, M03, M04"
> 
> paste(toString(ddf$year), toString(ddf$period))
[1] "1983, 1983, 1983, 1983 M01, M02, M03, M04"

@mso,paste0是paste的高效版本。使用paste0(toString(x[2]), " ", toString(x[3]))可以得到与paste行产生相同的输出。 - KFB
MSO,你的连接代码是有效的,但是在数据框中,我仍然得到像“1983, 1983, 1983 M01, M02, Mo3”这样的结果,使用以下命令。data$obs<-apply(data,1 ,function(x) paste0(toString(x[2]), toString(x[3]))) - Steven Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接