【问题标题】:Create a new column in a R dataframe using pattern matching [duplicate]使用模式匹配在 R 数据框中创建一个新列
【发布时间】:2015-04-10 16:28:22
【问题描述】:

我正在尝试基于使用模式匹配的现有列创建一个新列。现有列是用户代理字段,例如

"Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10"

我想创建一个使用模式匹配来识别设备的新列。

-所以如果 user_agent 像 '%iPad%' 和 user_agent 像 '%WebKit%' 那么设备就是 iPad。 - 如果用户代理 user_agent 像 '%Android%' 而 user_agent 不像 '%Mobile%' 那么设备是一个 android - 如果 (user_agent like '%Silk%' and user_agent like '%WebKit%') 那么设备是 kindle -if (user_agent like '%Playbook%') then device is Other

我想尝试使用 dplyr 中的 mutate 函数来创建新列,但需要有关如何构造正则表达式的帮助

即 mutate(data,device = ....)

【问题讨论】:

  • 当你展示你的数据时,这不是一列,而是一个包含一个元素的字符向量。我对这个不清楚的解释感到迷茫。
  • 用户代理字段是一列,其中的行代表不同的用户代理。因此,对于每一行,我想创建一个新列,用于标识用户代理字段是否为设备
  • 但这并不完全是你写的......你只是放了一个随机字符串,不受任何data.frame的影响......
  • 哦,我没看到。看起来我的数据格式已转换为代码行。我的意思是用户代理是数据框中的一列
  • ..and ....你能....tada....重新格式化您的数据:) ?

标签: regex r dplyr


【解决方案1】:

这样的?

x <- c("Mozilla/5.0 (iPad; stuff AppleWebKit more stuff",
        "Android",
        "stuff Silk more stuff and WebKit",
        "stuff Playbook more stuff", 
        "unknown")

y <- ifelse(grepl("iPad", x) & grepl("WebKit", x), "iPad", 
        ifelse(grepl("Android", x) & !grepl("Mobile", x), "android", 
                ifelse(grepl("Silk", x) & grepl("WebKit", x), "kindle", 
                        ifelse(grepl("Playbook", x), "other", 
                                "don't know")
                )
        )
)

data.frame(x, y)
                                                x          y
1 Mozilla/5.0 (iPad; stuff AppleWebKit more stuff       iPad
2                                         Android    android
3                stuff Silk more stuff and WebKit     kindle
4                       stuff Playbook more stuff      other
5                                         unknown don't know

编辑

或者这更容易:

device <- rep(NA_character_, length(x))

device[grepl("iPad", x) & grepl("WebKit", x)] <-  "iPad"
device[grepl("Android", x) & !grepl("Mobile", x)] <-  "android"
device[grepl("Silk", x) & grepl("WebKit", x)] <-  "kindle"
device[grepl("Playbook", x)] <-  "other"

data.frame(x, device)

                                                x  device
1 Mozilla/5.0 (iPad; stuff AppleWebKit more stuff    iPad
2                                         Android android
3                stuff Silk more stuff and WebKit  kindle
4                       stuff Playbook more stuff   other
5                                         unknown    <NA>

【讨论】:

  • 感谢杰夫的帮助。我是 grepl 的新手,但与 grep 不同,它似乎结合了多个条件。你们知道我如何在堆栈溢出时发布示例数据集吗?每次我尝试这样做时,它们都会作为一个订单项而不是数据框出现
  • grepl 返回一个逻辑向量,因此它对您尝试做的事情很有用(我认为)。通常最好获取一小部分数据样本,然后简单地复制/粘贴 dput(sampleData) 的输出
  • 如何修改为搜索“Kit”而不是“WebKit”,然后返回“kindle”?
猜你喜欢
  • 2023-03-22
  • 2016-05-15
  • 2019-08-12
  • 2022-01-26
  • 2019-07-18
  • 2022-11-23
  • 1970-01-01
  • 2020-12-10
  • 2020-01-31
相关资源
最近更新 更多