需要扩展在r中具有字符和数字值的data.frame

需要扩展在r中具有字符和数字值的data.frame,r,dplyr,tidyr,tidyverse,R,Dplyr,Tidyr,Tidyverse,我在一个列表中有几个数据帧,我正试图在purr中使用map将它们连接起来。我在结尾使用了full_join,因为它们的列并不都相同,作为一个有效的示例,我有以下内容: DF1 <- structure(list(scrubbed_species_binomial = c("Solanum montanum", "Solanum montanum", "Solanum montanum"), trait_name = c("whole plant woodiness", "whole p

我在一个列表中有几个数据帧,我正试图在purr中使用map将它们连接起来。我在结尾使用了
full_join
,因为它们的列并不都相同,作为一个有效的示例,我有以下内容:

DF1 <- structure(list(scrubbed_species_binomial = c("Solanum montanum", 
"Solanum montanum", "Solanum montanum"), trait_name = c("whole plant woodiness", 
"whole plant growth form", "whole plant growth form diversity"
), trait_value = c("herbaceous", "Herb", "Herb")), row.names = c(NA, 
3L), class = "data.frame", .Names = c("scrubbed_species_binomial", 
"trait_name", "trait_value"))
我得到以下信息

scrubbed_species_binomial whole plant growth form whole plant growth form diversity whole plant woodiness
1          Solanum montanum                    Herb                              Herb            herbaceous
问题 一些data.frames具有重复的数字特征,但由于特征值是一个字符列,因此当我尝试使用
spread
summary\u(is.numeric)
时,如果(is.numeric)出现错误

第一次尝试 我得到以下错误

Error: Duplicate identifiers for rows (2, 9, 10), (3, 4, 6), (5, 7, 8)
如果我试图总结一下,如果它也不起作用


让我知道我应该做什么

我认为这不是一个好的解决方案,因为它会在没有关联的地方创建关联的外观,但这可能会满足您的需要。这和@camille所说的是一样的,但有点充实

DF2 %>% 
  group_by(trait_name) %>% 
  mutate(id = 1:n()) %>% 
  spread(trait_name, trait_value, convert = TRUE) %>%
  fill(everything())

您需要告诉
spread
,重复的
trait\u name
应该在不同的行中出现,因此在
spread
之前添加
row\u number()
,您应该已经准备好了。

  scrubbed_species~ row_idx `leaf area per l~ `leaf dry mass ~ `leaf thickness` `whole plant gr~ `whole plant gr~
  <chr>               <int> <chr>             <chr>            <chr>            <chr>            <chr>           
1 Solanum peruvian~       1 1.84229918938836~ 1.913            0.2506           Herb             Herb            
2 Solanum peruvian~       2 2.21729490022173~ 2.166            0.2358           <NA>             <NA>            
3 Solanum peruvian~       3 2.07770621234157~ 1.898            0.2535           <NA>             <NA> 
scrawed_species~row_idx`每l叶面积~`叶干质量~`叶厚``整株gr ~`整株gr~
1秘鲁茄~1 1 1.84229918938836~1.913 0.2506草本植物
2秘鲁茄2.21729490022173~2.166 0.2358
3秘鲁茄~3 2.07770621234157~1.898 0.2535

样本数据:

df2 <- structure(list(scrubbed_species_binomial = c("Solanum peruvianum", 
"Solanum peruvianum", "Solanum peruvianum", "Solanum peruvianum", 
"Solanum peruvianum", "Solanum peruvianum", "Solanum peruvianum", 
"Solanum peruvianum", "Solanum peruvianum", "Solanum peruvianum", 
"Solanum peruvianum"), trait_name = c("whole plant growth form diversity", 
"leaf area per leaf dry mass", "leaf dry mass per leaf fresh mass", 
"leaf dry mass per leaf fresh mass", "leaf thickness", "leaf dry mass per leaf fresh mass", 
"leaf thickness", "leaf thickness", "leaf area per leaf dry mass", 
"leaf area per leaf dry mass", "whole plant growth form"), trait_value = c("Herb", 
"1.84229918938836e-05", "1.913", "2.166", "0.2506", "1.898", 
"0.2358", "0.2535", "2.21729490022173e-05", "2.07770621234157e-05", 
"Herb")), .Names = c("scrubbed_species_binomial", "trait_name", 
"trait_value"), row.names = c(NA, 11L), class = "data.frame")

df2在
spread
之前,您可以添加一个行号作为虚拟ID。这样将有一个类似
spread
的非重复列
DF2 %>% 
  group_by(trait_name) %>% 
  mutate(id = 1:n()) %>% 
  spread(trait_name, trait_value, convert = TRUE) %>%
  fill(everything())
library(dplyr)
library(tidyr)

df2 %>%
  group_by(scrubbed_species_binomial, trait_name) %>%
  mutate(row_idx = row_number()) %>%
  spread(trait_name, trait_value)
  scrubbed_species~ row_idx `leaf area per l~ `leaf dry mass ~ `leaf thickness` `whole plant gr~ `whole plant gr~
  <chr>               <int> <chr>             <chr>            <chr>            <chr>            <chr>           
1 Solanum peruvian~       1 1.84229918938836~ 1.913            0.2506           Herb             Herb            
2 Solanum peruvian~       2 2.21729490022173~ 2.166            0.2358           <NA>             <NA>            
3 Solanum peruvian~       3 2.07770621234157~ 1.898            0.2535           <NA>             <NA> 
df2 <- structure(list(scrubbed_species_binomial = c("Solanum peruvianum", 
"Solanum peruvianum", "Solanum peruvianum", "Solanum peruvianum", 
"Solanum peruvianum", "Solanum peruvianum", "Solanum peruvianum", 
"Solanum peruvianum", "Solanum peruvianum", "Solanum peruvianum", 
"Solanum peruvianum"), trait_name = c("whole plant growth form diversity", 
"leaf area per leaf dry mass", "leaf dry mass per leaf fresh mass", 
"leaf dry mass per leaf fresh mass", "leaf thickness", "leaf dry mass per leaf fresh mass", 
"leaf thickness", "leaf thickness", "leaf area per leaf dry mass", 
"leaf area per leaf dry mass", "whole plant growth form"), trait_value = c("Herb", 
"1.84229918938836e-05", "1.913", "2.166", "0.2506", "1.898", 
"0.2358", "0.2535", "2.21729490022173e-05", "2.07770621234157e-05", 
"Herb")), .Names = c("scrubbed_species_binomial", "trait_name", 
"trait_value"), row.names = c(NA, 11L), class = "data.frame")