首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在R中,我如何访问因子的每个级别的第一个元素?

在R中,我如何访问因子的每个级别的第一个元素?
EN

Stack Overflow用户
提问于 2014-03-20 06:15:17
回答 5查看 13.6K关注 0票数 20

我有一个这样的数据框架:

代码语言:javascript
复制
n = c(2, 2, 3, 3, 4, 4) 
n <- as.factor(n)
s = c("a", "b", "c", "d", "e", "f") 
df = data.frame(n, s)  

df
  n s
1 2 a
2 2 b
3 3 c
4 3 d
5 4 e
6 4 f

我想要访问因子的每个级别的第一个元素(在本例中有一个包含a, c, e的向量)。

可以达到一个级别的第一个元素,使用

代码语言:javascript
复制
df$s[df$n == 2][1]

但它并不适用于所有级别:

代码语言:javascript
复制
df$s[df$n == levels(n)]
[1] a f

你会怎么做呢?

为了更进一步,我想修改我的数据框,看看在每次出现时,哪个是每个级别的第一个元素。在我的示例中,新列应该是:

代码语言:javascript
复制
  n s rep firstelement
1 2 a   a            a
2 2 b   c            a
3 3 c   e            c
4 3 d   a            c
5 4 e   c            e
6 4 f   e            e
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-20 08:39:49

函数ave在以下情况下很有用:

代码语言:javascript
复制
df$firstelement = ave(df$s, df$n, FUN = function(x) x[1])
df
  n s firstelement
1 2 a            a
2 2 b            a
3 3 c            c
4 3 d            c
5 4 e            e
6 4 f            e
票数 6
EN

Stack Overflow用户

发布于 2014-03-20 12:16:31

在这种情况下,我更喜欢plyr包,它提供了更多的自由来操作数据。

代码语言:javascript
复制
library(plyr)
ddply(df,.(n),function(subdf){return(subdf[1,])})

  n s
1 2 a
2 3 c
3 4 e
票数 4
EN

Stack Overflow用户

发布于 2014-03-20 20:58:04

您还可以使用data.table

代码语言:javascript
复制
library(data.table)
dt = as.data.table(df)
dt[, list(firstelement = s[1]), by=n]

这会让你得到:

代码语言:javascript
复制
   n firstelement
1: 2            a
2: 3            c
3: 4            e

by=n位根据n的每个值对所有内容进行分组,因此s[1]将获取每个组的第一个元素。

要将其作为额外的专栏获取,您可以这样做:

代码语言:javascript
复制
dt[, newcol := s[1], by=n]
dt
#   n s newcol
#1: 2 a      a
#2: 2 b      a
#3: 3 c      c
#4: 3 d      c
#5: 4 e      e
#6: 4 f      e

因此,这只是从每个组的第一行获取s的值,并将其分配给一个新列。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22519297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档