创建一个新的变量,该变量等于文本变量,且组中的字符数最少

时间:2018-07-03 18:43:41

标签: r dataframe dplyr

我有一个带有因子变量的数据框,以及一个有助于对这些因子进行分组的ID。这是我的示例数据框和当前未获得正确答案的随附代码:

library(dplyr)
names <- c("Andrew","Andrew","Andy","Andy","Alex","Alexander")
name.id <- c(1,1,1,1,2,2)
df1 <- data.frame(names, name.id)

df1 <-  group_by(df1,name.id) %>%
        mutate(name.len=nchar(as.character(names)))  %>%
        mutate(new.name = min(as.character(names)))

我希望new.name变量等于具有最少字符数(name.len)的ID分组中的名称。对于ID = 1,该变量应为“ Alex”,但是使用最小变量只能比较每个数字中的字符,从而导致“ Andrew”中的“ r”低于“ Andy”中的“ y”。我不知道如何做一个条件变量来获取与组内最小nchar值相关的这个因素

编辑: 更清楚地说,我希望最终数据看起来像以下内容(帮助列也可以):

      names name.id new.names
1    Andrew       1      Andy
2    Andrew       1      Andy
3      Andy       1      Andy
4      Andy       1      Andy
5      Alex       2      Alex
6 Alexander       2      Alex

1 个答案:

答案 0 :(得分:1)

您可以对name.id进行分组,然后根据sort中的字符数对names进行分组。最后,为每个组选择最上面的行。

使用dplyr的解决方案可以是:

library(dplyr)

df1 %>% group_by(name.id) %>%
  mutate(newname = first(names, order_by = nchar(as.character(names)))) %>%
  as.data.frame()

#       names name.id newname
# 1    Andrew       1    Andy
# 2    Andrew       1    Andy
# 3      Andy       1    Andy
# 4      Andy       1    Andy
# 5      Alex       2    Alex
# 6 Alexander       2    Alex