从列中仅提取两个变量

时间:2019-04-09 01:24:35

标签: r

我在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

2 个答案:

答案 0 :(得分:0)

对于基本的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

请注意,由于它是固定宽度的文本,因此我们无需担心转换车牌号的子字符串。这意味着它甚至应该以文本形式正确排序。

答案 1 :(得分:0)

除了蒂姆的答案,如果您想一次完成所有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