【问题标题】:How to print a row that contains specific values of a column?如何打印包含特定列值的行?
【发布时间】:2017-11-02 01:48:24
【问题描述】:

我正在尝试创建一个循环并在列中搜索一个值,然后显示该值所在的所有第一行,我希望它从 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

【问题讨论】:

  • 在 if 条件下缺少 {
  • 在循环中错过了另一个 }
  • 看来你可能只想要library(dplyr); Em %>% filter(year %in% 1950:1951)
  • @RobJensen filter 返回年份 == 1950 或 1951 的所有行。OP 想要与 1950 和 1951 匹配的 first
  • @LaMachineInfernale,这将返回 year == 1950 或 1951 的所有记录。OP 想要与每年匹配的 first 记录。

标签: r for-loop if-statement


【解决方案1】:

使用 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)

【讨论】:

  • 两种解决方案都将返回 data.frames 如“结果”所示,如果你想要一个矩阵,只需使用as.matrix(Em_sub)
  • 用户,你能给我一个关于如何解决这个问题的建议吗? stackoverflow.com/questions/48835464/…
【解决方案2】:

这是一个基本解决方案。

t(sapply(split(Em, Em$year), function(x) x[1, ]))
#      year x y
# 1950 1950 5 3
# 1951 1951 6 7

简而言之,我们按年份拆分数据框以创建一个列表。我们遍历列表并返回第一行。最后,我们转置得到的矩阵,使其与Em具有相同的方向

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多