Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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_Dataframe_Data.table - Fatal编程技术网

R 如何根据数据的总体顺序更改特定的分类变量

R 如何根据数据的总体顺序更改特定的分类变量,r,dataframe,data.table,R,Dataframe,Data.table,我每五天收集一次关于植物发育或物候学的数据(使用分类变量“代码”编码),沿着一个划分为78个连续段的样带。在每个路段的横断面上调查每个物种 我的研究重复了100年前的一项历史研究,我保留了原始的物候编码方案,而没有考虑在夏天之后如何分析数据 在收集数据时,我没有考虑的问题是代码遵循一个序列,其中一个代码在夏季的早期和晚期重复。具体而言,代码为: b1 = single flower b2 = sparse flowers (two or three) b3 = flowers common (m

我每五天收集一次关于植物发育或物候学的数据(使用分类变量“代码”编码),沿着一个划分为78个连续段的样带。在每个路段的横断面上调查每个物种

我的研究重复了100年前的一项历史研究,我保留了原始的物候编码方案,而没有考虑在夏天之后如何分析数据

在收集数据时,我没有考虑的问题是代码遵循一个序列,其中一个代码在夏季的早期和晚期重复。具体而言,代码为:

b1 = single flower
b2 = sparse flowers (two or three)
b3 = flowers common (more than three)
B4 = flowering ended
根据最初研究的方法,夏季为任何开花植物收集的代码序列将类似于b1、b2、b3、b2、b1、b4。请注意,我们每五天访问一次横断面,代码可能在连续几天内重复,例如b1、b1、b2、b2、b2、b2、b2、b3、b3、b3、b2、b2、b1、b4

我想对“b1”和“b2”代码重新编码如下(参见示例和示例数据): 1.如果“b1”出现在“b2”或“b3”之前,则应为“b1a”,如果出现在“b2”或“b3”之后,则应为“b1b”。请注意,有时观察序列中没有“b2”或“b3”。

2.如果“b2”出现在“b3”之前,那么它应该是“b2a”,如果它出现在“b3”之后,那么它应该是“b2b”。或者,如果没有“b3”,那么“b2”应该是“b2a”。注意,重要的是要记住,在最后一次出现“b3”之后,可能会出现多个“b2”观测值(参见示例和样本数据)。

3.考虑“B1”和“B2”可能不发生并且观察“B3”,在这种情况下,两者都被编码为“B1A”和“B2A”。

以下是数据的外观:

Date    Segment Species Code
01-Jun-17   1   A   b1
06-Jun-17   1   A   b1
10-Jun-17   1   A   b2
14-Jun-17   1   A   b2
19-Jun-17   1   A   b2
23-Jun-17   1   A   b3
28-Jun-17   1   A   b3
03-Jul-17   1   A   b2
08-Jul-17   1   A   b2
14-Jul-17   1   A   b1
19-Jul-17   1   A   b4
23-Jul-17   1   A   b4
它应该是这样的:

Date    Segment Species Code
01-Jun-17   1   A   b1
06-Jun-17   1   A   b1a
10-Jun-17   1   A   b2a
14-Jun-17   1   A   b2a
19-Jun-17   1   A   b2a
23-Jun-17   1   A   b3
28-Jun-17   1   A   b3
03-Jul-17   1   A   b2b
08-Jul-17   1   A   b2b
14-Jul-17   1   A   b1b
19-Jul-17   1   A   b4
23-Jul-17   1   A   b4
以下是示例数据:

Test.Data<- structure(list(Date = structure(c(17318, 17323, 17327, 17331, 
17336, 17340, 17345, 17350, 17355, 17361, 17366, 17318, 17323, 
17327, 17331, 17336, 17340, 17345, 17350, 17355, 17361, 17366, 
17370, 17375, 17318, 17323, 17327, 17331, 17336, 17340, 17345, 
17350, 17355, 17361, 17366, 17318, 17323, 17327, 17331, 17336, 
17340, 17345, 17350, 17355, 17361, 17366, 17370, 17375, 17355, 
17361, 17366, 17370, 17375, 17350, 17355, 17361, 17366, 17370
), class = "Date"), Segment = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 1, 1, 1, 1, 1), Species = c("A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", "B", "B", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C"
), Code = c("b1", "b1", "b2", "b2", "b2", "b3", "b3", "b2", "b2", 
"b4", "b4", "b1", "b2", "b2", "b2", "b3", "b3", "b3", "b2", "b2", 
"b2", "b1", "b4", "b4", "b1", "b1", "b2", "b2", "b2", "b3", "b3", 
"b2", "b2", "b4", "b4", "b1", "b2", "b2", "b2", "b3", "b3", "b3", 
"b2", "b2", "b2", "b4", "b4", "b4", "b3", "b3", "b2", "b1", "b4", 
"b1", "b1", "b2", "b2", "b4")), .Names = c("Date", "Segment", 
"Species", "Code"), row.names = c(NA, -58L), class = "data.frame")

Test.Data您可以使用
dplyr

library(dplyr)
Test.Data %>% 
  group_by(Species) %>% 
  mutate(hadb3 = cumsum(Code=="b3")>0) %>%
  mutate(Code = ifelse(Code=="b2" & !hadb3,"b2a",Code)) %>% 
  mutate(Code = ifelse(Code=="b2" & hadb3,"b2b",Code)) 
结果:

# A tibble: 48 x 5
# Groups:   Species [2]
         Date Segment Species  Code hadb3
       <date>   <dbl>   <chr> <chr> <lgl>
 1 2017-06-01       1       A    b1 FALSE
 2 2017-06-06       1       A    b1 FALSE
 3 2017-06-10       1       A   b2a FALSE
 4 2017-06-14       1       A   b2a FALSE
 5 2017-06-19       1       A   b2a FALSE
 6 2017-06-23       1       A    b3  TRUE
 7 2017-06-28       1       A    b3  TRUE
 8 2017-07-03       1       A   b2b  TRUE
 9 2017-07-08       1       A   b2b  TRUE
10 2017-07-14       1       A    b4  TRUE
# ... with 38 more rows
#一个tible:48 x 5
#类群:种[2]
日期段物种代码hadb3
1 2017-06-01 1 A b1错误
2 2017-06-06 1 A b1错误
3 2017-06-10 1 A b2a错误
4 2017-06-14 1 A b2a错误
5 2017-06-19 1 A b2a错误
6 2017-06-23 1 A b3真实
7 2017-06-28 1 A b3真实
8 2017-07-03 1 A b2b真实
9 2017-07-08 1 A b2b真实
10 2017-07-14 1 A b4真实
# ... 还有38行
mutate(hadb3=cumsum(code==“b3”)>0)
创建一个逻辑列,用于检查
b3
之前是否出现过,这足以通过ifelse语句获得结果。

使用data.table:

library(data.table)
setDT(Test.Data)
Test.Data[, temp := rleid(Code), by = .(Segment, Species)] #unique ids for the sequence of codes
Test.Data[Code == "b2", Code := paste0(Code, letters[rleid(temp)]), 
  by = .(Segment, Species)] #use the unique ids inside subset
Test.Data[, temp := NULL]
#          Date Segment Species Code
# 1: 2017-06-01       1       A   b1
# 2: 2017-06-06       1       A   b1
# 3: 2017-06-10       1       A  b2a
# 4: 2017-06-14       1       A  b2a
# 5: 2017-06-19       1       A  b2a
# 6: 2017-06-23       1       A   b3
# 7: 2017-06-28       1       A   b3
# 8: 2017-07-03       1       A  b2b
# 9: 2017-07-08       1       A  b2b
#10: 2017-07-14       1       A   b4
#11: 2017-07-19       1       A   b4
#12: 2017-06-01       1       B   b1
#13: 2017-06-06       1       B  b2a
#14: 2017-06-10       1       B  b2a
#15: 2017-06-14       1       B  b2a
#16: 2017-06-19       1       B   b3
#17: 2017-06-23       1       B   b3
#18: 2017-06-28       1       B   b3
#19: 2017-07-03       1       B  b2b
#20: 2017-07-08       1       B  b2b
#21: 2017-07-14       1       B  b2b
#</cont>
库(data.table)
setDT(测试数据)
测试数据[,温度:=rleid(代码),由=(片段,物种)]#代码序列的唯一ID
测试数据[代码==“b2”,代码:=粘贴0(代码,字母[rleid(temp)]),
by=(段、种)#在子集内使用唯一ID
测试数据[,温度:=NULL]
#日期段物种代码
#1:2017-06-01 1A b1
#2:2017-06-06 1A b1
#3:2017-06-10 1A b2a
#4:2017-06-14 1A b2a
#5:2017-06-19 1A b2a
#6:2017-06-23 1A b3
#7:2017-06-28 1A b3
#8:2017-07-03 1 A b2b
#9:2017-07-08 1A b2b
#10:2017-07-14 1A b4
#11:2017-07-19 1A b4
#12:2017-06-01 1B b1
#13:2017-06-06 1B b2a
#14:2017-06-10 1B b2a
#15:2017-06-14 1B b2a
#16:2017-06-19 1B b3
#17:2017-06-23 1B b3
#18:2017-06-28 1B b3
#19:2017-07-03 1b b2b
#20:2017-07-08 1B b2b
#21:2017-07-14 1b b2b
#

谢谢。这给了我一个很好的起点。我的数据集(140000次观察)有许多其他物候学代码,与它们发育的其他方面有关(例如叶子生长和果实发育)。我将能够将我的数据子集,然后使用您的代码,然后将其重新插入原始数据集中。此外,在运行代码之前,您的方法假定数据按“日期”、“段”和“种类”排序。对于data.tables,排序非常快速和简单。您的示例似乎已排序。是否可以将sort命令添加到简化代码中?数据[顺序(片段、物种、日期)]我不会称链接为“简化代码”。只需使用
DT[order(…)]
开始链接。在进一步探索数据之后,我使用您的优秀解决方案更新了示例,以发现“意外的”数据序列,这当然是意料之中的!在进一步探索数据之后,我使用@Roland优秀解决方案更新了示例,以发现“意外”的数据序列,这当然是意料之中的!