【问题标题】:How to get different values for same ID in dataframe. And replace any of that different value for the same ID [duplicate]如何在数据框中获取相同 ID 的不同值。并为相同的 ID 替换任何不同的值 [重复]
【发布时间】:2019-05-16 01:25:32
【问题描述】:

我正在处理数据帧并且有一个数据集让我们说

ID   Name
1     aaa
1     aaa.
1     aaa
2     ccc
3     111.
3     333
3     111
3     111

我想要每个 ID 的最长字符串 输出。

1     aaa.
2     ccc
3     111.

数据:

dat <- structure(
  list(
    ID = c(1L, 1L, 1L, 2L, 3L, 3L, 3L, 3L),
    Name = c("aaa", "aaa.", "aaa", "ccc", "111.", "333", "111", "111")
    ),
  class = "data.frame",
  row.names = c(NA,-8L)
  )

【问题讨论】:

  • 不确定这是怎么复制的。试试library(dplyr);dat %&gt;% group_by(ID) %&gt;% slice(which.max(nchar(Name)))

标签: r


【解决方案1】:

dplyr:

dat %>% 
  group_by(ID) %>% 
   filter(nchar(Name)==max(nchar(Name)))
# A tibble: 3 x 2
# Groups:   ID [3]
     ID Name 
  <int> <chr>
1     1 aaa. 
2     2 ccc  
3     3 111.

使用base(可能需要一些过滤来匹配名称):

aggregate(.~ID,dat,function(x) x[which.max(x)])
  ID Name
1  1 aaa.
2  2  ccc
3  3  333

按照@Wil 的建议使用slicedplyr

dat %>% 
group_by(ID) %>% 
slice(which.max(nchar(Name)))

【讨论】:

  • dat %&gt;% group_by(ID) %&gt;% slice(which.max(nchar(Name)))的想法?我没有足够的代表来回答标记为重复的问题。
  • 我也无法回答重复的问题,但在它被标记为重复之前已经放置了一个答案。我只是取消删除它。我不确定,但slice 在这里(我认为)就足够了,因为这就是filter 正在做的事情。
  • 谢谢@Will 和 NelsonGon。我感谢你的努力。此解决方案适用于我的过滤器
  • @YagneshJani 欢迎您。很高兴它对你有用。
猜你喜欢
  • 2023-02-07
  • 2017-06-03
  • 2021-11-10
  • 2019-05-25
  • 1970-01-01
  • 2021-02-23
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多