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 创建