Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-如何使用循环根据匹配名称列表复制和更改数据帧_R_Loops - Fatal编程技术网

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

R-如何使用循环根据匹配名称列表复制和更改数据帧,r,loops,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

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

您描述的方法是正确的。但是,在修改
检测
值之前,需要先复制数据,以便不更改原始数据及其后续副本

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


为了澄清,您需要创建多个数据帧,每个数据帧都是原始数据帧的副本,每个物种的
检测设置为
1
?是的,因此它们基本上只是副本,但我希望每个物种的检测都是唯一的。因此,对于Lutra Lutra数据帧,存在L.Lutra检测的所有情况都将是1,而Vulpes情况(例如,在L.Lutra数据帧中)将保持0。希望这是清楚的。
> 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