Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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_Database - Fatal编程技术网

R 如何按类别将列中的数据重新组织为新列

R 如何按类别将列中的数据重新组织为新列,r,database,R,Database,我们收集了超过130000个夏季的植物物候观测数据,并将数据输入Excel。每个观察包括1到6个分类变量,描述植物物候的不同方面。例如,我可能会收集一个观察到的桦树生长的叶子,或者我可能会收集两个观察到的桦树生长和开花的叶子 不幸的是,我没有按照数据表上的逻辑顺序收集分类代码,因此在Excel中输入了分类代码,而没有反映物候代码的类别(即其他、叶片脱落、开花、果实、叶片衰老、叶片脱落),从而造成了一场数据噩梦 以下是我的数据(问题底部的R示例数据): 我的数据应该是这样的: 我已经创建了一个

我们收集了超过130000个夏季的植物物候观测数据,并将数据输入Excel。每个观察包括1到6个分类变量,描述植物物候的不同方面。例如,我可能会收集一个观察到的桦树生长的叶子,或者我可能会收集两个观察到的桦树生长和开花的叶子

不幸的是,我没有按照数据表上的逻辑顺序收集分类代码,因此在Excel中输入了分类代码,而没有反映物候代码的类别(即其他、叶片脱落、开花、果实、叶片衰老、叶片脱落),从而造成了一场数据噩梦

以下是我的数据(问题底部的R示例数据):

我的数据应该是这样的:

我已经创建了一个电子表格,上面有我所有的物候编码和它们相关的物候分类(同样,其他,叶子脱落,开花,果实,叶子衰老,叶子脱落)

我想使用我的物候代码电子表格,我已经导入到R中(见底部的代码),将我的数据集重新组织成上面所示的逻辑格式。我可以通过创建每个新字段,然后编写大量的条件语句(不需要物候代码电子表格!)来实现这一点,但我不知道如何有效地使用我的数据和物候代码快速高效地重新组织数据

最后,在我的物候学代码电子表格中,我创建了一个等级字段来处理这样一个事实:有时我的技术人员在同一个类别中记录了两个观察结果。在这种情况下,应始终以最高数字或等级为准

Sample.Data <- structure(list(Species = c("A", "B", "C", "D", "E","F", "G", "H", "I", 
               "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T"), 
               Code.1 = c("C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
               "C", "C", "C", "C", "C", "C", "C", "C", "C", "C"), 
               Code.2 = c("V", "0", "rf", "0", "0", "0", "uf", "uf", "uf", "uf", "0", "0", "0", 
               "0", "uf", "uf", "0", "0", "0", "0"), Code.3 = c("g3", "gd", "r3", "r3", "r3", "r3", 
               "V", "V", "V", "V", "g1", "gd", "vd", "g1", "V", "V", "g1", "r3", "r3", "r3"), 
               Code.4 = c("vd", "vd", "vd", "vd", "vd", "vd", "g3", "g3", "g3", "g3", "vd", "vd", "r2", 
               "vd", "g1", "vd", "vd", "vd", "vd", "vd"), 
               Code.5 = c("L2", "L1", "L1", "L2", "L2", "L2", "L2", "L2", "L3", "L2", "L3", "L2", "L2", 
               "L3", "L1", "L1", "L2", "L1", "L1", "L2"), 
               Code.6 = c("K", "K", "K", "K", "b1", "b3", "b2", "K", "K", "b4", "K", "K", "K", "b1", 
               "b3", "Y", "Z", "Y", "K", "b1")), .Names = c("Species", "Code.1", "Code.2", 
               "Code.3", "Code.4", "Code.5", "Code.6"), row.names = c(NA, -20L), class = "data.frame")

Pheno.Codes <- structure(list(`Pheno Code` = c("Y", "0", "Z", "A", "B1", "B2", 
               "C", "FA", "As", "Af", "R", "Rs", "Rf", "Ra", "K", "w", "m", "mw", 
               "wm", "st", "b", "b1", "b2", "b3", "b2", "b4", "uf", "rd", "rf", 
               "V", "VL", "Vb", "gd", "gb", "g1", "g2", "g3", "ed", "r", "r1", 
               "r2", "r3", "vd", "vt", "L", "L1", "L2", "L3", "L4", "X"), 
               `Pheno Category` = c("Other", "Other", "Leaf-out", "Leaf-out", 
               "Leaf-out", "Leaf-out", "Leaf-out", "Flowering", "Flowering", 
               "Flowering", "Flowering", "Flowering", "Flowering", "Flowering", 
               "Flowering", "Flowering", "Flowering", "Flowering", "Flowering", 
               "Flowering", "Flowering", "Flowering", "Flowering", "Flowering", 
               "Flowering", "Flowering", "Fruit", "Fruit", "Fruit", "Fruit", 
               "Fruit", "Fruit", "Leaf senescence", "Leaf senescence", 
               "Leaf senescence", "Leaf senescence", "Leaf senescence", 
               "Leaf senescence", "Leaf senescence", "Leaf senescence", 
               "Leaf senescence", "Leaf senescence", "Leaf senescence", 
               "Leaf senescence", "Leaf abscission", "Leaf abscission", 
               "Leaf abscission", "Leaf abscission", "Leaf abscission", 
               "Other"), Rank = c(0, 0.1, 0.5, 1, 1.1, 1.2, 1.3, 2, 2, 2.1, 2, 
               2, 2.1, 2.3, 2, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, NA, 2.3, NA, 
               2.5, 3, 3.1, 3.2, 3.2, 3.2, 3.3, 4, 4, 4.1, 4.2, 4.3, 4.4, 4.4, 
               4.5, 4.6, 4.7, 4.8, 4.9, 5, 5, 5.1, 5.2, 5.3, 6)), .Names = c("Pheno Code", 
               "Pheno Category", "Rank"), class = "data.frame", row.names = c(NA, -50L), 
               class = "data.frame")

Sample.Data2 <- structure(list(Species = c("A", "B", "C", "D", "E","F", "G", "H", "I", 
               "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T"), 
               Code.1 = c("C", "C", "B1", "C", "", "C", "C", "C", "C", "C", 
               "C", "C", "C", "C", "C", "C", "C", "C", "C", "C"), 
               Code.2 = c("V", "0", "rf", "0", "0", "0", "uf", "uf", "uf", "uf", "0", "", "0", 
               "0", "uf", "uf", "0", "0", "0", "0"), Code.3 = c("g3", "gd", "r3", "r3", "r3", "r3", 
               "V", "V", "", "V", "g1", "gd", "vd", "g1", "V", "V", "g1", "r3", "r3", "r3"), 
               Code.4 = c("", "vd", "vd", "vd", "vd", "vd", "g3", "g3", "g3", "g3", "vd", "vd", "r2", 
               "qd", "g1", "vd", "vd", "vd", "vd", "vd"), 
               Code.5 = c("L2", "L1", "L1", "L7", "L2", "L2", "L2", "L2", "L3", "L2", "L3", "L2", "L2", 
               "L3", "L1", "L1", "L2", "L1", "L1", "L2"), 
               Code.6 = c("", "", "K", "K", "b1", "b6", "b2", "K", "K", "b4", "K", "K", "K", "b1", 
               "b3", "Y", "Z", "Y", "K", "b1")), .Names = c("Species", "Code.1", "Code.2", 
               "Code.3", "Code.4", "Code.5", "Code.6"), row.names = c(NA, -20L), class = "data.frame")

Sample.Data使用
数据的可能解决方案。表

# load the 'data.table'-package
library(data.table)

# convert both dataframes to data.table's
setDT(Sample.Data)
setDT(Pheno.Codes)

# reshape 'Sample.Data' to long format
sample.long <- melt(Sample.Data, id = 'Species')

# join with 'Pheno.Codes'
# filter/select for each 'Species'/'pheno.cat' combo the row where the rank is equal to the max rank
# reshape the result into wide format again
sample.long[Pheno.Codes, on = c('value' = 'Pheno Code'), `:=` (pheno.cat = `Pheno Category`, rnk = Rank)
            ][, .SD[rnk == max(rnk)], by = .(Species, pheno.cat)
              ][, dcast(.SD, Species ~ pheno.cat, value.var = 'value', fill = '')]

更新

为了响应注释中提到的规范,您可以将代码调整为:

setDT(Sample.Data2)
setDT(Pheno.Codes)

sample.long <- melt(Sample.Data2, id = 'Species')[value != '']

sample.long[Pheno.Codes, on = c('value' = 'Pheno Code'), `:=` (pheno.cat = `Pheno Category`, rnk = Rank)
            ][is.na(pheno.cat), `:=` (pheno.cat = 'ERROR', rnk = 0)
              ][, .SD[rnk == max(rnk)], by = .(Species, pheno.cat)
                ][, dcast(.SD, Species ~ pheno.cat, value.var = 'value', fill = '')]
setDT(示例数据2)
setDT(现象代码)

sample.long使用
tidyverse
方法,您可以运行以下代码:

library(tidyverse)
以长格式重塑
Sample.Data

sample_long <- Sample.Data %>% 
    gather(key=code,value=value,c(Code.1:Code.6)) %>% 
    ungroup() %>% 
    select(-code)
这是输出:

# A tibble: 20 x 7
   Species Flowering Fruit `Leaf-out` `Leaf abscission` `Leaf senescence` Other
 * <chr>   <chr>     <chr> <chr>      <chr>             <chr>             <chr>
 1 A       K         V     C          L2                vd                NA   
 2 B       K         NA    C          L1                vd                0    
 3 C       K         rf    C          L1                vd                NA   
 4 D       K         NA    C          L2                vd                0    
 5 E       b1        NA    C          L2                vd                0    
 6 F       b3        NA    C          L2                vd                0    
 7 G       NA        V     C          L2                g3                NA   
 8 H       K         V     C          L2                g3                NA   
 9 I       K         V     C          L3                g3                NA   
10 J       b4        V     C          L2                g3                NA   
11 K       K         NA    C          L3                vd                0    
12 L       K         NA    C          L2                vd                0    
13 M       K         NA    C          L2                vd                0    
14 N       b1        NA    C          L3                vd                0    
15 O       b3        V     C          L1                g1                NA   
16 P       NA        V     C          L1                vd                Y    
17 Q       NA        NA    C          L2                vd                0    
18 R       NA        NA    C          L1                vd                0    
19 S       K         NA    C          L1                vd                0    
20 T       b1        NA    C          L2                vd                0 
#一个tible:20x7
种开花果实`出叶`叶片脱落`叶片衰老`其他
*                                          
1akvcl2vdna
2BkNaCl1Vd0
3CkRfCl1VdNa
4dk-NA-C-l2vd0
5eB1NaCl2Vd0
6 F b3 NA C L2 vd 0
7g钠Vc L2 g3钠
8hkvcl2g3na
9 I K V C L3 g3 NA
10 J b4 V C L2 g3 NA
11 K NA C L3 vd 0
12 L K NA C L2 vd 0
13mknacl2vd0
14 N b1 NA C L3 vd 0
15 O b3 V C L1 g1 NA
16p-NA-V-C-L1-vd-Y
17 Q NA-C L2 vd 0
18 R NA NA C L1 vd 0
19 Sk NA C L1 vd 0
20吨b1钠碳L2 vd 0

您可以通过更改代码最后一行中
fill
参数的值来设置缺失数据的值

@Japp您的解决方案非常好。我仍在努力解决两个问题,以便用完整的数据集实现它。在创建此解决方案时,我没有(出于充分的理由)包含代码不正确的记录(即在“酚类代码”数据集中找不到记录和NA记录(例如,对一个物种有一个观察,因此“代码2”、“代码3”等列为空)@KeithLarson很高兴我能帮上忙。你想对代码不正确的记录和NA值的th记录做什么?你想分配一个
pheno.code
吗?@Japp两件事,1)我想删除所有带有空白值(即“”)的记录,例如,取我的样本数据集,并在任何“code”字段中空白以进行模拟,和2)创建一个名为“错误”的临时“现象类别”,以便我可以查找记录并修复数据。@KeithLarson可以在你的问题中包含一些额外的示例数据来重现问题?@KeithLarson没问题,我看到许多瑞典人犯了这个错误;-)有关如何解决问题的可能解决方案,请参阅我答案中的更新
sample_coded <- left_join(sample_long,Pheno.Codes,by=c("value"="Pheno Code")) %>%
    distinct() %>% 
    group_by(Species,`Pheno Category`) %>% 
    filter(Rank==max(Rank)) %>% 
    ungroup() %>% 
    select(-Rank) %>% 
    spread(key=`Pheno Category`,value=value,fill=NA)
# A tibble: 20 x 7
   Species Flowering Fruit `Leaf-out` `Leaf abscission` `Leaf senescence` Other
 * <chr>   <chr>     <chr> <chr>      <chr>             <chr>             <chr>
 1 A       K         V     C          L2                vd                NA   
 2 B       K         NA    C          L1                vd                0    
 3 C       K         rf    C          L1                vd                NA   
 4 D       K         NA    C          L2                vd                0    
 5 E       b1        NA    C          L2                vd                0    
 6 F       b3        NA    C          L2                vd                0    
 7 G       NA        V     C          L2                g3                NA   
 8 H       K         V     C          L2                g3                NA   
 9 I       K         V     C          L3                g3                NA   
10 J       b4        V     C          L2                g3                NA   
11 K       K         NA    C          L3                vd                0    
12 L       K         NA    C          L2                vd                0    
13 M       K         NA    C          L2                vd                0    
14 N       b1        NA    C          L3                vd                0    
15 O       b3        V     C          L1                g1                NA   
16 P       NA        V     C          L1                vd                Y    
17 Q       NA        NA    C          L2                vd                0    
18 R       NA        NA    C          L1                vd                0    
19 S       K         NA    C          L1                vd                0    
20 T       b1        NA    C          L2                vd                0