选择R中字符串最长的列

onh*_*alu 9 string comparison select r dplyr

我有这种类型的数据集

DF    
     V1     V2     V3
1.   A      AAA    B
2.   BBB    B      CC
3.   C      BB     CCC
Run Code Online (Sandbox Code Playgroud)

我想从 DF 中选择最长的字符串并将其放入新列 WINNER 中,如下所示:

DF    
     V1     V2     V3    WINNER
1.   A      AAA    B     AAA
2.   BBB    B      CC    BBB
3.   C      BB     CCC   CCC
Run Code Online (Sandbox Code Playgroud)

我试过了

mutate( WINNER = select(which.max (c(nchar(V1), nchar(V2), nchar(V3))) 
Run Code Online (Sandbox Code Playgroud)

但它仅适用于数值。我更喜欢 dplyr 解决方案。

Dan*_*l O 9

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
Run Code Online (Sandbox Code Playgroud)

  • 是的,在 `apply` 函数中,将 `df` 替换为 `df[,2:ncol(df)]` 或 `df[,c("V2","V3")]` 或您想要的任何内容。 (3认同)

det*_*det 7

在平局的情况下,获胜者将基于首次出场:

df$WINNER <- apply(df, 1, function(row) row[which.max(nchar(row))])
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用c_across()。您在其中输入的内容将控制选择哪些列。

library(dplyr)

df %>% 
  rowwise() %>% 
  mutate(WINNER = c_across(starts_with("V"))[which.max(nchar(c_across(starts_with("V"))))])
Run Code Online (Sandbox Code Playgroud)

如果您想要所有列,它可以更紧凑一些。

df %>% 
  rowwise() %>% 
  mutate(WINNER = c_across()[which.max(nchar(c_across()))])
Run Code Online (Sandbox Code Playgroud)