我在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
答案 0 :(得分:0)
对于基本的R解决方案,我们可以尝试将lapply
和strsplit
一起使用,以识别每一行中每个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