我有一个这样的数据框架:
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
的向量)。
可以达到一个级别的第一个元素,使用
df$s[df$n == 2][1]
但它并不适用于所有级别:
df$s[df$n == levels(n)]
[1] a f
你会怎么做呢?
为了更进一步,我想修改我的数据框,看看在每次出现时,哪个是每个级别的第一个元素。在我的示例中,新列应该是:
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
发布于 2014-03-20 08:39:49
函数ave
在以下情况下很有用:
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
发布于 2014-03-20 12:16:31
在这种情况下,我更喜欢plyr包,它提供了更多的自由来操作数据。
library(plyr)
ddply(df,.(n),function(subdf){return(subdf[1,])})
n s
1 2 a
2 3 c
3 4 e
发布于 2014-03-20 20:58:04
您还可以使用data.table
library(data.table)
dt = as.data.table(df)
dt[, list(firstelement = s[1]), by=n]
这会让你得到:
n firstelement
1: 2 a
2: 3 c
3: 4 e
by=n
位根据n
的每个值对所有内容进行分组,因此s[1]
将获取每个组的第一个元素。
要将其作为额外的专栏获取,您可以这样做:
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
的值,并将其分配给一个新列。
https://stackoverflow.com/questions/22519297
复制相似问题