【问题标题】:count frequency of rows based on a column value in R根据 R 中的列值计算行的频率
【发布时间】:2015-01-16 22:45:48
【问题描述】:

我知道这是一个非常简单的问题,但我一直无法找到答案。

我有一个数据框,可以为您提供一个人的 ID 和他的爱好。由于一个人可能有很多爱好,因此 id 字段可能会在多行中重复,每行都有不同的爱好。我一直在尝试只打印那些有多个爱好的行。我能够使用 table 获得频率。

  1. 但是如何应用条件仅在频率大于一时才打印。

  2. 其次,有没有更好的方法来查找频率而不使用表格。

这是我对没有过滤器的表的尝试,频率大于一

> id=c(1,2,2,3,2,4,3,1)
> hobby = c('play','swim','play','movies','golf','basketball','playstation','gameboy')
> df = data.frame(id, hobby)
> table(df$id)

1 2 3 4 
2 3 2 1 

【问题讨论】:

  • tbl <- table(df$id); tbl[tbl > 1]
  • 您是否要过滤数据?还是频率表?
  • 谢谢@RichardScriven,我会继续的。只是补充一下,有没有一种方法可以在没有频率的情况下单独在数据框中获取 id?
  • 表在哪些方面不满足你

标签: r


【解决方案1】:

尝试使用数据表,我发现它比使用 table() 函数更具可读性:

library(data.table)
id=c(1,2,2,3,2,4,3,1)
hobby = c('play','swim','play','movies',
          'golf','basketball','playstation','gameboy')
df = data.frame(id=id, hobby=hobby)
dt = as.data.table(df)
dt[,hobbies:=.N, by=id]

根据您的情况,您将获得:

> dt[hobbies >1,]
    id       hobby hobbies
1:  1        play       2
2:  2        swim       3
3:  2        play       3
4:  3      movies       2
5:  2        golf       3
6:  3 playstation       2
7:  1     gameboy       2

【讨论】:

  • 另一种不分配新列 dt[, .(hobby[.N > 1], .N[.N > 1]), by = id] 然后它也有序出来的方式
  • @RichardScriven,真的很酷,如果不那么可读!但恐怕它会在您编写时重命名列。
  • 对,对不起dt[, .(hobby=hobby[.N > 1], N=.N[.N > 1]), by = id]应该更好
【解决方案2】:

此示例假设您正在尝试过滤 df

id=c(1,2,2,3,2,4,3,1)
hobby = c('play','swim','play','movies','golf','basketball',
'playstation','gameboy')
df = data.frame(id, hobby)
table(df$id)

获取所有具有多个爱好的 id

tmp <- as.data.frame(table(df$id))
tmp <- tmp[tmp$Freq > 1,]

使用该信息 - 在 df 中选择他们的 ID

df1 <- df[df$id  %in% tmp$Var1,]
df1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2020-09-06
    • 2017-07-25
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多