我试图制作一个循环并在列中搜索一个值,然后显示该值的所有第一行,我希望从1950年到2016年
Em=
year x y
1950 5 3
1950 4 3
1950 2 4
1950 1 5
1951 6 7
1951 5 6
1951 1 4
1951 0 3
我一直在尝试这个:
for (p in 1:nrow(Em)){
if (Em[p,"year"]==1950)
break
print(Em[p,])} #it is not showing me just the first row that matches
{ else if (Em[p,"year"]==1951)
break
print(Em[p,])}
并获得
year x y
1950 5 3
1951 6 7
答案 0 :(得分:2)
Base R的解决方案:
Em_sub = aggregate(. ~ year, data = Em, '[', 1)
或dplyr
:
library(dplyr)
Em_sub = Em %>%
group_by(year) %>%
slice(1)
<强>结果:强>
year x y
1 1950 5 3
2 1951 6 7
# A tibble: 2 x 3
# Groups: year [2]
year x y
<int> <int> <int>
1 1950 5 3
2 1951 6 7
数据:强>
Em = read.table(text = "year x y
1950 5 3
1950 4 3
1950 2 4
1950 1 5
1951 6 7
1951 5 6
1951 1 4
1951 0 3", header = TRUE)
答案 1 :(得分:1)
这是一个基本解决方案。
t(sapply(split(Em, Em$year), function(x) x[1, ]))
# year x y
# 1950 1950 5 3
# 1951 1951 6 7
简而言之,我们按年分割数据框以创建列表。我们遍历列表并返回第一行。最后,我们将结果矩阵转置为与Em