提问人:Andreas 提问时间:9/6/2009 最后编辑:OmGAndreas 更新时间:4/29/2019 访问量:1771
data.frame 子集长格式
data.frame subset long format
问:
我想这个问题会有一个非常简单的答案。但这里是。
长格式数据。喜欢这个
d <- data.frame(cbind(numbers = rnorm(10),
year = rep(c(2008, 2009), 5),
name = c("john", "David", "Tom", "Kristin", "Lisa","Eve","David","Tom","Kristin","Lisa")))
如何获取仅包含 2008 年和 2009 年中出现的名称行的新数据帧?(即只有大卫、克里斯汀、丽莎和汤姆)。
提前致谢
答:
3赞
hadley
9/6/2009
#1
一种方法是使用 reshape 包创建一个 data.frame,其中列中包含年份,行中包含名称:
library(reshape)
cast(d, name ~ year, value = "numbers")
然后,您可以使用它来提取感兴趣的行。complete.cases
评论
0赞
Andreas
9/7/2009
谢谢哈德利!我一直在寻找一种不涉及来回铸造和熔化的方法。我应该明确这一点。无论如何,谢谢!
2赞
hadley
9/6/2009
#2
如果每年只有一条记录,只需计算每个人在数据集中出现的次数:
counts <- as.data.frame(table(name = d$name))
然后寻找出现两次的每个人:
subset(counts, Freq == 2)
评论
0赞
Andreas
9/7/2009
事实确实如此。但是我仍然需要用 count$name-或类似的东西子集 d。
0赞
Andreas
9/7/2009
是的 - %in% 是我的新朋友 :-)
1赞
Steve Lianoglou
9/7/2009
#3
这是另一个解决方案,它只使用基本 R,并且不对一个人每年拥有的记录数做出任何假设:
d <- data.frame(cbind(numbers = rnorm(10),
year = rep(c(2008, 2009), 5),
name = c("john", "David", "Tom", "Kristin",
"Lisa","Eve","David","Tom","Kristin",
"Lisa")))
# split data into 2 data.frames (1 for each year)
by.year <- split(d, d$year, drop=T)
# find the names that appear in both years
keep <- intersect(by.year[['2008']]$name, by.year[['2009']]$name)
# Or, if you had several years, use Reduce as a more general solution:
keep <- Reduce(intersect, lapply(by.year, '[[', 'name'))
# show the rows of the original dataset only if their $name field
# is in our 'keep' vector
d[d$name %in% keep,]
评论
0赞
Andreas
9/7/2009
非常感谢史蒂夫。我怀疑Reduce对我来说非常有用。不知道。
11赞
Marek
9/7/2009
#4
简单的方法:
subset(
d,
name %in% intersect(name[year==2008], name[year==2009])
)
上一个:有没有好的 R 对象浏览器?
评论