【问题标题】:R: Using "Gsub" a lost my data frame formatR:使用“Gsub”丢失了我的数据框格式
【发布时间】:2014-08-24 02:54:02
【问题描述】:

我有这个数据框:

  Campaña           Visitas  Compras
1 faceBOOKAds-1     524       2
2 FacebookAds-2      487      24
3 fcebookAds-3      258       4
4 Email1            8         7 

我想要这个:

  Campaña    Visitas  Compras
1 FBAds1     524       2
2 FBAds2     487      24
3 FBAds3     258       4
4 Email1       8       7

1) 我读到“GSUB”可以完成这项工作,所以我使用了这个:

DataGoogle2 <- gsub("faceBOOKAds-1", "FBAds", DataGoogle1$Campaña)

但我得到了这个矢量对象(如你所见,我丢失了 data.frame 格式):

[1] "FBAds"              "FacebookAds-2"      "fcebookAds-3"      "Email1" ...

2)然后我尝试使用:as.data.frame:

DataGoogle2 <- as.data.frame(gsub("faceBOOKAds-1", "FBAds", DataGoogle1$Campaña))

但是得到这个(没有数据框格式):

1                                                FBAds
2                                        fFacebookAds-2
3                                        fcebookAds-3
4                                               Email1 

我怎样才能得到我需要的东西?我知道替换方法不太好。我最需要的是不要松散数据框格式,但欢迎任何有关 REGEX 部分的帮助!

【问题讨论】:

  • 顺便说一句,您是否也在 R-Help 上发布了这个问题(或一个非常相似的问题)?我的理解是,在两个网站上同时提出相同或相似的问题时,交叉发布或多次发布或任何可能的术语都不是一个好习惯。

标签: regex r gsub


【解决方案1】:

您可以使用转换(和另一个正则表达式)。

DataGoogle2 <- transform(DataGoogle1, Campaña = sub("(?i)fa?cebook(.*)-(.*)", 
                                                    "FB\\1\\2", Campaña))
#   Campaña Visitas Compras
# 1  FBAds1     524       2
# 2  FBAds2     487      24
# 3  FBAds3     258       4
# 4  Email1       8       7

函数subgsub 返回一个向量。因此,输出中不存在所有其他列的信息。使用transform,您可以修改现有数据框的列并返回一个新列。

在正则表达式中,(?i) 启动 区分大小写模式。此外,我使用了sub,因为我假设每个字符串永远不会超过一个匹配项。

【讨论】:

  • 谢谢史蒂夫。您能否解释一下这一点= 1)为什么使用 sub 而不是 gsub。这是因为此数据框中的出现可能只有一个(每行/条目)? 2)在正则表达式中:(?i)表示大写“F”是可选的?我将如何应用它来表示:无论任何字母是否大写,都只需匹配此正则表达式。非常感谢。
  • @OmarGonzales 我添加了一些解释。
  • 谢谢,斯文。我会在 R 的正则表达式中找到一本好书。我正在阅读“Master Regular Exresions 3Edition”,它谈到了基于 Perl 引擎的正则表达式。但欢迎任何建议。 *只是为了让一切都清楚:正则表达式中的 \\1\\2 是什么?我认为它匹配相同的“广告”部分,但不明白逻辑。
  • @OmarGonzales,您可能想查看“替换 ...”下的 here 以获得进一步的解释。顺便说一句,能够使用 (?i) 而不是 ignore.case = TRUE 对我来说是新的。
  • Gaston Sanchez 对正则表达式和字符串处理做了很好的解释。这是一个大约 100 页的免费 PDF,标题为“在 R 中处理和处理字符串”。他不涉及捕获组和环视断言,但他非常擅长基础知识。
【解决方案2】:

当您使用以下代码时:

DataGoogle2 <- gsub("faceBOOKAds-1", "FBAds", DataGoogle1$Campaña)

R 读取到您希望数据框仅包含 DataGoogle1$Campaña 列,因此您会得到该输出。

相反,试试这个:

DataGoogle2$Campaña <- gsub("faceBOOKAds-1", "FBAds", DataGoogle1$Campaña)

这样你是说你想要转换 COLUMN 而不是 DATA FRAME。在任何代码中,您的 LHS 表达与您的 RHS 代码一样重要。

希望这会有所帮助。

【讨论】:

  • 感谢@user3694373!现在更清楚了,我尝试的是错误的。谢谢哥们!
【解决方案3】:

您也可以直接替换第一列。这仅通过仅对第一列进行操作来替换第一列中的所需部分。这将保持所需的数据帧结构。

> dat[[1]] <- gsub("f(.*)[-]", "FBAds", dat[[1]], ignore.case = TRUE)
> dat
#   Campaña Visitas Compras
# 1  FBAds1     524       2
# 2  FBAds2     487      24
# 3  FBAds3     258       4
# 4  Email1       8       7

...假设您的原始数据称为dat

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多