R - 如何使用循环,根据匹配的名称列表复制和改变数据框架。

问题描述 投票:3回答:1

我有一个数据框,其中包括各种物种,以及一列显示它们的存在(检测列)。我想最终得到一个数据帧列表,每个物种一个。在每个物种的新数据框中,我希望将匹配的物种检测值变成 "1",同时将所有其他物种的检测值保持为0。 这里是一个有两个物种的数据框示例。

structure(list(Camera.Trap.Name = c("CT-Tst-1-1", "CT-Tst-2-1", 
"CT-Tst-2-1", "CT-Tst-2-1", "CT-Tst-2-1", "CT-Tst-2-1", "CT-Tst-2-1", 
"CT-Tst-2-1", "CT-Tst-3-1", "CT-Tst-3-1", "CT-Tst-3-1", "CT-Tst-3-1", 
"CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", 
"CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", 
"CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", 
"CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-5-1", 
"CT-Tst-5-1", "CT-Tst-5-1", "CT-Tst-8-1", "CT-Tst-8-1", "CT-Tst-8-1", 
"CT-Tst-8-1", "CT-Tst-8-1", "CT-Tst-8-1", "CT-Tst-8-1", "CT-Tst-8-1", 
"CT-Tst-8-1", "CT-Tst-9-1", "CT-Tst-9-1", "CT-Tst-9-1"), Sampling.Event = c("Olney 1", 
"Olney 2", "Olney 2", "Olney 2", "Olney 2", "Olney 2", "Olney 2", 
"Olney 2", "Olney 3", "Olney 3", "Olney 3", "Olney 3", "Olney 5", 
"Olney 5", "Olney 5", "Olney 5", "Olney 5", "Olney 5", "Olney 5", 
"Olney 5", "Olney 5", "Olney 5", "Olney 5", "Olney 5", "Olney 5", 
"Olney 5", "Olney 5", "Olney 5", "Olney 5", "Olney 5", "Olney 5", 
"Olney 7", "Olney 7", "Olney 7", "Olney 7", "Olney 7", "Olney 7", 
"Olney 7", "Olney 7", "Olney 7", "Olney 7", "Olney 7", "Olney 7", 
"Olney 5", "Olney 5", "Olney 5"), Photo.Date = c("2018-03-28", 
"2018-04-20", "2018-05-02", "2018-05-07", "2018-05-09", "2018-05-10", 
"2018-05-11", "2018-05-15", "2019-11-13", "2019-11-14", "2019-11-15", 
"2019-11-16", "2020-03-24", "2020-03-25", "2020-03-26", "2020-03-31", 
"2020-04-01", "2020-04-02", "2020-04-03", "2020-04-04", "2020-04-04", 
"2020-04-05", "2020-04-06", "2020-04-06", "2020-04-07", "2020-04-07", 
"2020-04-08", "2020-04-09", "2020-04-10", "2020-04-11", "2020-04-11", 
"2020-04-23", "2020-04-24", "2020-05-02", "2020-04-28", "2020-04-29", 
"2020-04-30", "2020-05-01", "2020-05-02", "2020-05-03", "2020-05-04", 
"2020-05-05", "2020-05-06", "2020-04-01", "2020-04-05", "2020-04-06"
), Species_name = c("Vulpes vulpes", "Vulpes vulpes", "Vulpes vulpes", 
"Vulpes vulpes", "Vulpes vulpes", "Vulpes vulpes", "Vulpes vulpes", 
"Vulpes vulpes", "Vulpes vulpes", "Vulpes vulpes", "Vulpes vulpes", 
"Vulpes vulpes", "Vulpes vulpes", "Lutra lutra", "Vulpes vulpes", 
"Vulpes vulpes", "Vulpes vulpes", "Vulpes vulpes", "Vulpes vulpes", 
"Lutra lutra", "Vulpes vulpes", "Vulpes vulpes", "Lutra lutra", 
"Vulpes vulpes", "Lutra lutra", "Vulpes vulpes", "Vulpes vulpes", 
"Vulpes vulpes", "Vulpes vulpes", "Lutra lutra", "Vulpes vulpes", 
"Vulpes vulpes", "Vulpes vulpes", "Vulpes vulpes", "Lutra lutra", 
"Lutra lutra", "Lutra lutra", "Lutra lutra", "Lutra lutra", "Lutra lutra", 
"Lutra lutra", "Lutra lutra", "Lutra lutra", "Vulpes vulpes", 
"Vulpes vulpes", "Vulpes vulpes"), Detection = c(0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
), Elevation = c(207, 213, 213, 213, 213, 213, 213, 213, 189, 
189, 189, 189, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 
169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 186, 
186, 186, 186, 186, 186, 186, 186, 186, 222, 222, 222)), row.names = c(NA, 
-46L), class = "data.frame")

我希望有一些看起来像下面的东西, 如果它是Vulpes vulpes的新数据框架。

Camera.Trap.Name Sampling.Event Photo.Date  Species_name Detection Elevation
CT-Tst-5-1        Olney 7       2020-05-02  Vulpes vulpes      1       169
CT-Tst-8-1        Olney 7       2020-04-28   Lutra lutra       0       186
CT-Tst-8-1        Olney 7       2020-04-29   Lutra lutra       0       186

我曾尝试创建独特的物种名称列表,并创建一个循环,通过数据帧,如果名称匹配,则将检测值改为1,最后为该物种创建一个新的,更新的数据帧。这些都是非常不成功的,所以所有的帮助将是感激的。

r loops
1个回答
1
投票

你描述的方法是正确的。但是,你需要先复制数据,然后再修改你的 Detection 值,这样就不会改变原始数据和后续的副本。

s = unique(df$Species_name)   # list of unique species names

m = list()   # empty list (to fill with copies of the data)

for (i in s) {
  temp = df  # make a copy of the data frame

   # change Detection to 1 where species name match
  temp$Detection[temp$Species_name==i] = 1 

  m[[i]] = temp # place the new data in the array
}

(该 temp 变量只是为了让代码更易读。你可以直接复制到 m[[i]])

现在你将拥有 m 作为一个包含2个数据框的列表。

> m[["Vulpes vulpes"]]
....
12       CT-Tst-3-1        Olney 3 2019-11-16 Vulpes vulpes         1       189
13       CT-Tst-5-1        Olney 5 2020-03-24 Vulpes vulpes         1       169
14       CT-Tst-5-1        Olney 5 2020-03-25   Lutra lutra         0       169
15       CT-Tst-5-1        Olney 5 2020-03-26 Vulpes vulpes         1       169

> m[['Lutra lutra']]
....
12       CT-Tst-3-1        Olney 3 2019-11-16 Vulpes vulpes         0       189
13       CT-Tst-5-1        Olney 5 2020-03-24 Vulpes vulpes         0       169
14       CT-Tst-5-1        Olney 5 2020-03-25   Lutra lutra         1       169
15       CT-Tst-5-1        Olney 5 2020-03-26 Vulpes vulpes         0       169
© www.soinside.com 2019 - 2024. All rights reserved.