R - 如何使用循环根据匹配名称列表复制和更改数据框

标签 r loops

我有一个由各种物种组成的数据框,以及一个显示它们存在的列(检测列)。我想以一个数据框列表结束,每个物种一个。在每个物种新数据框中,我希望匹配的物种检测值变为“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,最后为该物种创建一个新的更新数据框。这些都非常不成功,因此将不胜感激所有帮助。 谢谢

最佳答案

您描述的方法是正确的。但是,在修改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

关于R - 如何使用循环根据匹配名称列表复制和更改数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62134679/

相关文章:

excel - 如何为列中的每个单元格执行函数并循环遍历所有工作簿?

java - 从名称为variableX的变量中检索数据 - Java

javascript - limitTo : not working in AngularJS

ios - 在 Swift 中循环遍历 Realm 对象字段

r - 代码不适用于其他 shp 文件

从字符向量中删除可能包含特殊字符而不匹配单词部分的整个单词列表

sql - 如果 y 条件为真,如何计算特征 x (bigquery)

r - 取消列出列名称并在facet_grid中使用它

r - 从 RStudio 终端访问 Rust

C - 多次递归写入一个指针后出现内存访问错误