【问题标题】:Creating a subset in R using a double loop Continuation使用双循环继续在 R 中创建子集
【发布时间】:2015-02-07 22:02:48
【问题描述】:

DF:

年份 1901 1901 1903 1968 1978 2002 2006 2010

物种 1 1 2 65 1 82 3 1

纬度:49 46 47 47 48 43.1 44.23 47.11

长:-79.22 -79.5 -78.22 -79.84 -78.11 -77.114 -76.33 -76.2

朱利安日:79 125 165 178 193 68 90 230

土地:16 24 25 30 34 34 39 41

还有更多变量,但这是矩阵的一个示例。我只想保留每年的行以及对于 Julian_day 具有最低值的每个物种。即:此处将省略第二行,因为 1901 年物种 1 的 79 小于 125。

【问题讨论】:

  • 你能提供你想要的输出吗?
  • 这可能是我们可以提供帮助的data.frame?结构(列表(年 = c(1901、1901、1903、1968、1978、2002、2006、2010),物种 = c(1、1、2、65、1、82、3、1),纬度 = c( 49, 46, 47, 47, 48, 43.1, 44.23, 47.11), long = c(79.22, -79.5, -78.22, -79.84, -78.11, -77.114, -76.33, -76.2), Julian_Day = c(79 , 125, 165, 178, 193, 68, 90, 230), Land = c(16, 24, 25, 30, 34, 34, 39, 41)), .Names = c("年份", "物种" , "lat", "long", "Julian_Day", "Land"), row.names = c(NA, -8L), class= "data.frame")
  • 从这个例子中,我的实际数据集包含 ~120,000 行和 15 列,我想要:年份物种 lat long Julian _Day Land 1901 1 49 -79.22 79 16 1903 2 47 -78.22 165 25等等......基本上输出看起来与原始数据相同,除了我会丢失第二行数据(第二个 1901 年),因为我只想要那一年的儒略日(该物种的第一次出现)的最小值。
  • DJJ,我不确定你是否建议我制作一个数据框,但我正在处理从 excel 导入的大量数据,只是想消除这些行不符合我的条件。我只想保留有关每个年份每个物种的最小儒略日值信息的行。
  • 试试library(data.table); setDT(df)[ ,.SD[which.min(Julian_Day)], Year]

标签: r conditional subset


【解决方案1】:

首先。我建议您以易于使用的格式提供data.frame。我们将能够更好更快地为您提供帮助

 df  <- structure(list(Year  = c(1901,  1901, 1903,  1968, 1978,
 2002, 2006, 2010), species = c(1, 1, 2, 65, 1, 82, 3, 1), lat =
 c(49,  46, 47,  47, 48,  43.1, 44.23,  47.11), long  = c(79.22,
 -79.5,  -78.22,   -79.84,  -78.11,  -77.114,   -76.33,  -76.2),
 Julian_Day =  c(79, 125, 165,  178, 193,  68, 90, 230),  Land =
 c(16,   24,   25,   30,   34,    34,   39,   41)),   .Names   =
 c("Year",  "species",  "lat",  "long",  "Julian_Day",  "Land"),
 row.names = c(NA, -8L), class = "data.frame")

这是你的data.frame

 df
 #   Year species   lat    long Julian_Day Land
 #1: 1901       1 49.00  79.220         79   16
 #2: 1901       1 46.00 -79.500        125   24
 #3: 1903       2 47.00 -78.220        165   25
 #4: 1968      65 47.00 -79.840        178   30
 #5: 1978       1 48.00 -78.110        193   34
 #6: 2002      82 43.10 -77.114         68   34
 #7: 2006       3 44.23 -76.330         90   39
 #8: 2010       1 47.11 -76.200        230   41

一般来说,你只需要dput(head(your dataframe)),但如果不能透露你的数据,你可以建立一个小的假数据框来说明你的观点。

她是使用data.table 包的可能解决方案

library(data.table)
setDT(df)[ ,.SD[which.min(Julian_Day)], .(species, Year)]

【讨论】:

  • 我猜他们需要setDT(df)[ ,.SD[which.min(Julian_Day)], .(species, Year)]
  • 哦,我想我终于到了某个地方。我厌倦了上面的第一个选项并且它起作用了,除了它每年只给我一个观察(数据行),所以我只有大约一百行,因为我正在使用 100 年的时间跨度,当每年都有通常至少有 4 到 5 个物种(这真的取决于年份)...如果这是有道理的,即对于 1901 年,我实际上应该有六行数据,因为那一年观察到了六种不同的物种
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2022-08-09
  • 2019-01-02
  • 2011-08-19
相关资源
最近更新 更多