【问题标题】:Text manipulation using lapply()使用 lapply() 进行文本操作
【发布时间】:2018-01-29 02:29:04
【问题描述】:

问题

还有其他方法可以使用lapply() 粘贴数据框中每列中每个元素的列名吗?

问题

目前,我正在为每一列重新使用lapply()

可重现的示例

# create data
df <- data.frame(
  Chicago_Has = c("Lou Malnati's", "Wrigley Field", "CTA" )
  , Seattle_Has = c("Piroshky Piroshky", "Safeco Field", "KCMT" )
  , stringsAsFactors = FALSE
)

# paste column name into each element 
# within each column
df[ "Chicago_Has" ] <- lapply( X = df[ "Chicago_Has" ]
                               , FUN = function(i) paste( "Chicago_Has", i, sep = " " )
                               )
df[ "Seattle_Has" ] <- lapply( X = df[ "Seattle_Has" ]
                               , FUN = function(i) paste( "Seattle_Has", i, sep = " ")
)

# examine the desired result of the data frame
df

#                 Chicago_Has                   Seattle_Has
# 1 Chicago_Has Lou Malnati's Seattle_Has Piroshky Piroshky
# 2 Chicago_Has Wrigley Field      Seattle_Has Safeco Field
# 3           Chicago_Has CTA              Seattle_Has KCMT

想法

目前,我认为这种方法涉及太多的复制和粘贴。如果我将colnames( df ) 存储为字符向量,我不知道如何使用该对象——同时只使用一次lapply()——来获得我想要的结果。我认为这涉及在我在FUN 中提供的函数中使用多个计数器,但我不确定如何继续。

【问题讨论】:

    标签: r dataframe text lapply


    【解决方案1】:
    df[]=Map(paste,names(df),df)
    df
                    Chicago_Has                   Seattle_Has
    1 Chicago_Has Lou Malnati's Seattle_Has Piroshky Piroshky
    2 Chicago_Has Wrigley Field      Seattle_Has Safeco Field
    3           Chicago_Has CTA              Seattle_Has KCMT
    

    【讨论】:

    • 谢谢你,@Onyambu!我从来不知道 base::Map() 函数。感谢您的帮助。
    • 阅读base::Map() 的文档后,使用mapply() 似乎也会给我完全相同的结果。 df[] &lt;- mapply( FUN = paste, colnames( df ), df)
    【解决方案2】:

    只是为了完成,一个带有lapply 的选项,其中我们将每列的pastename 设置为单独的列值。

    df[] <- lapply(names(df), function(x) paste(x, df[[x]]))
    df
    
    #                Chicago_Has                   Seattle_Has
    #1 Chicago_Has Lou Malnati's Seattle_Has Piroshky Piroshky
    #2 Chicago_Has Wrigley Field      Seattle_Has Safeco Field
    #3           Chicago_Has CTA              Seattle_Has KCMT
    

    【讨论】:

    • 啊,你把df的列名作为X的值,然后将X中的每个元素粘贴到df中x列中的每个元素。这太棒了 - 感谢您的帮助!
    【解决方案3】:

    使用 包中的map2_dfr 迭代df 的每一列及其列名并粘贴到每一列中的元素的解决方案。

    library(purrr)
    
    df2 <- map2_dfc(df, names(df), ~paste(.y, .x, sep = " "))
    df2
    # # A tibble: 3 x 2
    #   Chicago_Has               Seattle_Has                  
    #   <chr>                     <chr>                        
    # 1 Chicago_Has Lou Malnati's Seattle_Has Piroshky Piroshky
    # 2 Chicago_Has Wrigley Field Seattle_Has Safeco Field     
    # 3 Chicago_Has CTA           Seattle_Has KCMT
    

    【讨论】:

    • 我相信它与map in purr中的概念相同
    • @Onyambu 是的,感谢您分享您的解决方案。我不熟悉基本 R Map 函数。
    • 当然。它非常好。
    • @www 谢谢你的解释!我还没有探索过purrr 包,所以我很欣赏介绍。
    【解决方案4】:

    您不需要使用lapply 来获得所需的输出,因为paste 函数已经矢量化了:

    df$Chicago_Has <- paste("Chicago_Has", df$Chicago_Has)
    df
                    Chicago_Has       Seattle_Has
    1 Chicago_Has Lou Malnati's Piroshky Piroshky
    2 Chicago_Has Wrigley Field      Safeco Field
    3           Chicago_Has CTA              KCMT
    

    Demo

    【讨论】:

    • 你是对的,蒂姆!但是我正在使用的数据框有超过 2 列,这就是我想避免单独使用 paste 函数的原因。无论数据框包含多少列,我都需要复制并粘贴 paste 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多