首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多列值合并为一列?

如何将多列值合并为一列?
EN

Stack Overflow用户
提问于 2015-05-16 16:11:01
回答 2查看 725关注 0票数 3

我有一个名为“茎输出”的数据框架(见下文):

代码语言:javascript
复制
     X1      X2       X3      X4      X5      X6      X7     X8     X9    X10     
1  tanaman  cabai                                    
2  banget   hama     sakit   tanaman                            
3  koramil  nogosari melaks  ecek     hama   tanaman padi    ppl    ds   rambun

我希望将多个列值合并到一个列中,如下所示:

代码语言:javascript
复制
     TEXT
1  tanaman cabai                                     
2  banget hama sakit tanaman                            
3  koramil nogosari melaks ecek hama tanaman padi ppl ds rambun 

我已经尝试过这个代码,它可以工作。

代码语言:javascript
复制
stemmoutput$TEXT <- with(stemmoutput, paste(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10, sep=" "))

但是,有没有其他更有效的方法,而不必一个一个地写下列的名称呢?

我也尝试过这样的代码,但这也不起作用。

代码语言:javascript
复制
for(i in names(stemmoutput)){
     stemmoutput$TEXT <- with(stemmoutput, paste(i, sep=" "))}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-16 16:13:13

试试do.call

代码语言:javascript
复制
library(stringr)
newdat <- data.frame(TEXT=str_trim(do.call(paste, stemmoutput)),
                     stringsAsFactors=FALSE)

newdat
#                                                         TEXT
#1                                                tanaman cabai
#2                                    banget hama sakit tanaman
#3 koramil nogosari melaks ecek hama tanaman padi ppl ds rambun

如果列中有多个部分的单词,则最好使用,作为分隔符。

代码语言:javascript
复制
 TEXT <- gsub(', [^A-Za-z]+', '', do.call(paste, c(stemmoutput, sep=', ')))

 newdat <- data.frame(TEXT, stringsAsFactors=FALSE)
 newdat
 #                                                                  TEXT
 #1                                                        tanaman, cabai
 #2                                          banget, hama, sakit, tanaman
 #3 koramil, nogosari, melaks, ecek, hama, tanaman, padi, ppl, ds, rambun
票数 2
EN

Stack Overflow用户

发布于 2015-05-16 16:45:47

下面是使用tidyr的另一个想法

如果希望只从unite列到X1列到X10列,则可以这样做:

代码语言:javascript
复制
library(tidyr)
unite(stemmoutput, TEXT, num_range("X", 1:10), sep = " ")

如果要将所有列合并,请执行以下操作:

代码语言:javascript
复制
unite(stemmoutput, TEXT, everything(), sep = " ")

基准测试

我在基准测试中尝试了这两种方法,因为我怀疑unite会比do.call快得多,但它们最终是相当等价的:

代码语言:javascript
复制
df <- data.frame(replicate(10,sample(paste0(
  sample(LETTERS[1:10]), collapse = ""), 10e5, replace = TRUE)))

mbm <- microbenchmark(
  akrun = data.frame(TEXT=str_trim(do.call(paste, df)), stringsAsFactors=FALSE),
  steven = unite(df, TEXT, everything(), sep = " "),
  times = 50
)

代码语言:javascript
复制
# Unit: milliseconds
#    expr       min        lq      mean    median       uq       max neval cld
#   akrun 1117.1350 1132.3861 1146.3943 1136.3094 1145.076 1232.5633    50   b
#  steven  910.7432  924.0386  927.8614  927.7224  929.649  995.3584    50  a
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30277904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档