【问题标题】:Extract cells and adjacent cells that may appear anywhere within a dataframe in R提取可能出现在 R 中数据框中任何位置的单元格和相邻单元格
【发布时间】:2017-05-09 04:11:53
【问题描述】:

我有一个数据框,其中包含有关植被覆盖率和覆盖率百分比的信息,这些信息是使用样方收集的。设置数据框,使每一行代表一个样方。如果一个样方中有多个物种,则它们都列在同一行中,相应的百分比覆盖率始终在下一列中。这是一个例子,物种用4个字母代码表示:

问题在于物种没有按任何特定顺序记录,而且并非所有物种都出现在每个样方中。每个样方也可以有任意数量的物种。我需要能够提取每个物种及其各自的覆盖范围,并将它们放入另一个数据框中以进行进一步分析。例如,上述示例数据中的物种“bope”如下所示:

非常感谢任何帮助。 布赖恩

【问题讨论】:

  • 请为您的问题提供一个可重现的示例。对于可能热衷于帮助您的任何人来说,插入屏幕截图通常无济于事。

标签: r dataframe extract


【解决方案1】:

您可以通过将数据重新整形为长格式然后按行值过滤来完成此操作。

df = data.frame(Quadrat = 1:6, Date = seq.Date(as.Date("2014-01-01"), by = 1, length = 6), Species_1 = c("unk1", "bope", "bope", "stgu", "bg","bope"),
                covrage = sample(1:100,6), Species_2 = c("bope", "bial", "stgu", "bg","unk1", "bg"), covrage2 = sample(1:100,6))

> df
  Quadrat       Date Species_1 covrage Species_2 covrage2
1       1 2014-01-01      unk1      76      bope       63
2       2 2014-01-02      bope      82      bial       33
3       3 2014-01-03      bope      41      stgu        5
4       4 2014-01-04      stgu       6        bg       45
5       5 2014-01-05        bg      65      unk1       21
6       6 2014-01-06      bope      15        bg       96

df$Species_1 = as.character(df$Species_1)
df$Species_2 = as.character(df$Species_2)


df2 = reshape(df, varying = list(c("Species_1", "Species_2"), c("covrage", "covrage2")), v.names = c("Species", "Covrage"), direction = "long")

> df2
    Quadrat       Date time Species Covrage id
1.1       1 2014-01-01    1    unk1      76  1
2.1       2 2014-01-02    1    bope      82  2
3.1       3 2014-01-03    1    bope      41  3
4.1       4 2014-01-04    1    stgu       6  4
5.1       5 2014-01-05    1      bg      65  5
6.1       6 2014-01-06    1    bope      15  6
1.2       1 2014-01-01    2    bope      63  1
2.2       2 2014-01-02    2    bial      33  2
3.2       3 2014-01-03    2    stgu       5  3
4.2       4 2014-01-04    2      bg      45  4
5.2       5 2014-01-05    2    unk1      21  5
6.2       6 2014-01-06    2      bg      96  6

> df2[df2$Species == "bope", colnames(df2) %in% c("Quadrat", "Covrage")]
    Quadrat Covrage
2.1       2      82
3.1       3      41
6.1       6      15
1.2       1      63

【讨论】:

    【解决方案2】:

    如果您不希望按日期显示,让我忽略日期列,

    这是一个示例数据框

    species1 = replicate(20, paste(sample(LETTERS, 5), collapse = ""))
    coverage1 = rnorm(20, 50, 30)
    species2 = sample(species1)
    coverage2 = sample(1:100, 20,replace = TRUE)
    df = data.frame(species1, coverage1, species2, coverage2)
    
    df
       species1   coverage1 species2 coverage2
    1     KIRGD  -6.1879727    OBHTY        96
    2     SXKAB  70.4472228    GUROP        40
    3     LSWME  59.4121446    OMABR        29
    4     KVSRD  53.8434373    PAQCJ        12
    5     KHRUD  62.8253485    SXKAB        57
    6     FOAGY  83.1087433    WUEMQ         4
    7     QHYZL  52.2393233    KIRGD        47
    8     EGDHA  82.2169139    RJKUS        72
    9     GXFAR  58.1819166    SXNGO        16
    10    SXNGO  -0.6093836    QHYZL         2
    11    ZJQOA  99.1073472    KHRUD        28
    12    PAQCJ  -1.0029008    TEPIZ        40
    13    TEPIZ  55.5824570    WNLYJ        31
    14    RJKUS  55.7524571    GDQOV        27
    15    WUEMQ   9.4777950    LSWME         9
    16    GDQOV  31.9365398    KVSRD        28
    17    OBHTY   5.8709309    GXFAR        89
    18    OMABR -20.5623502    ZJQOA        85
    19    WNLYJ  75.9212241    FOAGY        11
    20    GUROP  60.7119029    EGDHA        38
    

    获取每个物种的覆盖率

    species = unique(df$species1, df$species2)
    sapply(species, function(x)df[grep(x, df$species1),]$coverage2)
    cols = grep("coverage", colnames(df))
    coverage = lapply(cols, function(y)sapply(species, function(x)df[grep(x, df[,(y-1)]),][,y]) )
    df2 = data.frame(species, coverage1 = coverage[[1]], coverage2 = coverage[[2]])
    
    df2
       species   coverage1 coverage2
    1    KIRGD  -6.1879727        47
    2    SXKAB  70.4472228        57
    3    LSWME  59.4121446         9
    4    KVSRD  53.8434373        28
    5    KHRUD  62.8253485        28
    6    FOAGY  83.1087433        11
    7    QHYZL  52.2393233         2
    8    EGDHA  82.2169139        38
    9    GXFAR  58.1819166        89
    10   SXNGO  -0.6093836        16
    11   ZJQOA  99.1073472        85
    12   PAQCJ  -1.0029008        12
    13   TEPIZ  55.5824570        40
    14   RJKUS  55.7524571        72
    15   WUEMQ   9.4777950         4
    16   GDQOV  31.9365398        27
    17   OBHTY   5.8709309        96
    18   OMABR -20.5623502        29
    19   WNLYJ  75.9212241        31
    20   GUROP  60.7119029        40
    

    【讨论】:

    • 这个例子我已经看过了,我明白了。但是,我的数据比示例 df 更混乱,因为原始 df 中的每个物种列的长度不同。所以,我正在寻找的最终产品需要是一个列表(我认为)。由于物种的不同出现,覆盖率列看起来都不同。是否可以使用每个列具有不同数量的物种的初始 df(尽管现在应该是一个列表)重新创建您的示例?
    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多