【问题标题】:Pull out only two variables from a column从列中仅提取两个变量
【发布时间】:2019-04-09 01:24:35
【问题描述】:

我在 R 中有一个数据框,其中一列有多个变量。变量以 ABC、DEF、GHI 开头。这些变量后跟一系列 6 个数字(即 ABC052689、ABC062895、DEF045158)。

对于每一行,我想提取一个 ABC 实例(编号最大的那个)。

如果该行有ABC052689、ABC062895、DEF045158,我希望它拉出ABC062895,因为它大于ABC052689。

然后我想对以 DEF###### 开头的变量执行相同的操作。

我已设法过滤数据,使其具有 ABC 所在的行,而 DEF 或 GHI 所在的行:

library(tidyverse)
data_with_ABC <- test %>% 
  filter(str_detect(car,"ABC"))

data_with_ABC_and_DEF_or_GHI <- data_with_ABC %>% 
  filter(str_detect(car, "DEF") | str_detect(car, "GHI"))

我不知道怎么抽出来,比如说数字最大的 ABC

ABC052689, ABC062895, DEF045158 -> ABC062895

【问题讨论】:

  • 要明确:数据框test 包含一列car,其中该列的每一行都是逗号分隔的字符串?
  • 是的@neilfws 你是对的。数据框“测试”包含一列“汽车”,其中每一行包含一个逗号分隔的字符串

标签: r


【解决方案1】:

对于基本 R 解决方案,我们可以尝试使用 lapplystrsplit 来识别每个 CSV 字符串中每行中最大的 ABC 板。

df <- data.frame(car=c("ABC052689,ABC062895,DEF045158"), id=c(1),
    stringsAsFactors=FALSE)
df$largest <- lapply(df$car, function(x) {
    cars <- strsplit(x, ",", fixed=TRUE)[[1]]
    cars <- cars[substr(cars, 1, 3) == "ABC"]
    max <- cars[which.max(substr(cars, 4, 9))]
    return(max)
})
df

                            car id   largest
1 ABC052689,ABC062895,DEF045158  1 ABC062895

请注意,我们不需要担心转换车牌号的子字符串,因为它是固定宽度的文本。这意味着即使是文本也应该正确排序。

【讨论】:

  • 感谢@Tim Biegeleisen,我没有正确表达我的问题。列 car 包含一个逗号分隔的字符串,该字符串可以有多个 ABC、DEF 和/或 GHI 实例
  • 因为我是 R 新手,所以我试图弄清楚每个步骤的作用,除了 strsplit 函数中的 '[[1]]' 部分之外,大部分步骤都很清楚。我在 strsplit 的 R 文档中看到它,但它没有定义
  • @rdavis strsplit 返回一个列表,因此[[1]] 表示访问列表中的第一个元素,即包含拆分项向量的元素。
【解决方案2】:

除了蒂姆的回答,如果你想一次做所有的 ABC/DEF,下面的代码可能对library(tidyverse) 有帮助:

> df <- data.frame(car=c("ABC052689", "ABC062895", "DEF045158", "DEF192345"),                  stringsAsFactors=FALSE)
> 
> df2 = df %>% 
+     mutate(state = str_sub(car, 1, 3), plate = str_sub(car, 4, 9))
> 
> df2
        car state  plate
1 ABC052689   ABC 052689
2 ABC062895   ABC 062895
3 DEF045158   DEF 045158
4 DEF192345   DEF 192345
> 
> df2 %>% 
+   group_by(state) %>% 
+   summarise(maxplate = max(plate)) %>% 
+   mutate(full = str_c(state, maxplate))
# A tibble: 2 x 3
  state maxplate full     
  <chr> <chr>    <chr>    
1 ABC   062895   ABC062895
2 DEF   192345   DEF192345

【讨论】:

  • 感谢@liuminzhao,我没有正确表达我的问题。列 car 包含一个逗号分隔的字符串,该字符串可能包含 ABC、DEF 和/或 GHI 的多个实例
  • @rdavis,然后您可以使用read_csv 导入您的csv文件并先转换为数据框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多