Select R 中最长字符串的列
Select column with the longest string in R
我有这种类型的数据集
DF
V1 V2 V3
1. A AAA B
2. BBB B CC
3. C BB CCC
我想 select DF 中最长的字符串并将其放入新列 WINNER 中,如下所示:
DF
V1 V2 V3 WINNER
1. A AAA B AAA
2. BBB B CC BBB
3. C BB CCC CCC
我试过了
mutate( WINNER = select(which.max (c(nchar(V1), nchar(V2), nchar(V3)))
但它仅适用于数值。我更喜欢 dplyr 解决方案。
如果出现平局,则获胜者将基于第一次出现:
df$WINNER <- apply(df, 1, function(row) row[which.max(nchar(row))])
df$winner <- apply(df,1, function(x) x[which.max(nchar(x))])
df
V1 V2 V3 winner
1. A AAA B AAA
2. BBB B CC BBB
3. C BB CCC CCC
df$winner <-
Reduce(function(x, y) ifelse(nchar(y) > nchar(x), y, x), df)
df
# V1 V2 V3 winner
# 1: A AAA B AAA
# 2: BBB B CC BBB
# 3: C BB CCC CCC
一个dplyr
选项可以是。
df %>%
rowwise() %>%
mutate(WINNER = get(paste0("V", which.max(nchar(c_across(V1:V3))))))
V1 V2 V3 WINNER
<chr> <chr> <chr> <chr>
1 A AAA B AAA
2 BBB B CC BBB
3 C BB CCC CCC
您可以使用 c_across()
。您在其中输入的内容将控制选择哪些列。
library(dplyr)
df %>%
rowwise() %>%
mutate(WINNER = c_across(starts_with("V"))[which.max(nchar(c_across(starts_with("V"))))])
如果您想要所有列,它可以更紧凑一些。
df %>%
rowwise() %>%
mutate(WINNER = c_across()[which.max(nchar(c_across()))])
遗憾的是,R 中的 max/min
没有 python 中的 key
参数,但可以很快做出类似的东西。我会建议这样的事情:
library(tidyverse)
df <- read_table(
"
V1 V2 V3
A AAA B
BBB B CC
C BB CCC
"
)
max_key <- function(vars, fn) {
vars[which.max(fn(vars))]
}
df %>%
rowwise() %>%
mutate(
winner = max_key(c_across(V1:V3), str_length)
)
#> # A tibble: 3 x 4
#> # Rowwise:
#> V1 V2 V3 winner
#> <chr> <chr> <chr> <chr>
#> 1 A AAA B AAA
#> 2 BBB B CC BBB
#> 3 C BB CCC CCC
由 reprex package (v0.3.0)
于 2020-06-26 创建
我有这种类型的数据集
DF
V1 V2 V3
1. A AAA B
2. BBB B CC
3. C BB CCC
我想 select DF 中最长的字符串并将其放入新列 WINNER 中,如下所示:
DF
V1 V2 V3 WINNER
1. A AAA B AAA
2. BBB B CC BBB
3. C BB CCC CCC
我试过了
mutate( WINNER = select(which.max (c(nchar(V1), nchar(V2), nchar(V3)))
但它仅适用于数值。我更喜欢 dplyr 解决方案。
如果出现平局,则获胜者将基于第一次出现:
df$WINNER <- apply(df, 1, function(row) row[which.max(nchar(row))])
df$winner <- apply(df,1, function(x) x[which.max(nchar(x))])
df
V1 V2 V3 winner
1. A AAA B AAA
2. BBB B CC BBB
3. C BB CCC CCC
df$winner <-
Reduce(function(x, y) ifelse(nchar(y) > nchar(x), y, x), df)
df
# V1 V2 V3 winner
# 1: A AAA B AAA
# 2: BBB B CC BBB
# 3: C BB CCC CCC
一个dplyr
选项可以是。
df %>%
rowwise() %>%
mutate(WINNER = get(paste0("V", which.max(nchar(c_across(V1:V3))))))
V1 V2 V3 WINNER
<chr> <chr> <chr> <chr>
1 A AAA B AAA
2 BBB B CC BBB
3 C BB CCC CCC
您可以使用 c_across()
。您在其中输入的内容将控制选择哪些列。
library(dplyr)
df %>%
rowwise() %>%
mutate(WINNER = c_across(starts_with("V"))[which.max(nchar(c_across(starts_with("V"))))])
如果您想要所有列,它可以更紧凑一些。
df %>%
rowwise() %>%
mutate(WINNER = c_across()[which.max(nchar(c_across()))])
遗憾的是,R 中的 max/min
没有 python 中的 key
参数,但可以很快做出类似的东西。我会建议这样的事情:
library(tidyverse)
df <- read_table(
"
V1 V2 V3
A AAA B
BBB B CC
C BB CCC
"
)
max_key <- function(vars, fn) {
vars[which.max(fn(vars))]
}
df %>%
rowwise() %>%
mutate(
winner = max_key(c_across(V1:V3), str_length)
)
#> # A tibble: 3 x 4
#> # Rowwise:
#> V1 V2 V3 winner
#> <chr> <chr> <chr> <chr>
#> 1 A AAA B AAA
#> 2 BBB B CC BBB
#> 3 C BB CCC CCC
由 reprex package (v0.3.0)
于 2020-06-26 创建