无法将值从MySQL传递给tidyr :: spread

时间:2017-03-04 03:48:46

标签: r tidyr

这是我从lacal MySQL数据库收到的数据,并试图使其格式化,

   VT    Val   Unt   Nm    Tm
 <chr>  <chr> <chr> <chr> <dbl>
1 BW-201 11    Id    0B    79
2 BW-201 13    Bm    0B    79
3 BW-201  8    Id    0B    79
4 BW-201 10    Bm    0B    79
5 BW-201  4    Id    0B    79
6 BW-201  1    Bm    0B    79

使用con %>% tbl("ivt") %>% head()它会返回上面的数据,但是当我尝试传播它时,它就出错了

con %>% tbl("vt") %>% head() %>% tbl_df() %>% spread("Unt","Val")

Error: Duplicate identifiers for rows (2, 4, 6), (1, 3, 5)

无论是引用/取消引用,还是传播/传播,都是错误的。 顺便说一句,如果我不使用tbl_df(),它会返回

Error: Key column 'Unt' does not exist in input.

请建议,非常感谢。

1 个答案:

答案 0 :(得分:1)

数据中没有足够的列来唯一标识key:value对。解决方案是添加一个带行号的col。然后使用dplyrfilterjoin删除NA。

df <- read.table(text="
VT    Val   Unt   Nm    Tm
1 BW-201 11    Id    0B    79
2 BW-201 13    Bm    0B    79
3 BW-201  8    Id    0B    79
4 BW-201 10    Bm    0B    79
5 BW-201  4    Id    0B    79
6 BW-201  1    Bm    0B    79", header=T, stringsAsFactors = F)

df$row <- 1:nrow(df) # add explicit row numbers

library(tidyr)
spread(df, key=Unt, value=Val)
    #       VT Nm Tm row Bm Id
    # 1 BW-201 0B 79   1 NA 11
    # 2 BW-201 0B 79   2 13 NA
    # 3 BW-201 0B 79   3 NA  8
    # 4 BW-201 0B 79   4 10 NA
    # 5 BW-201 0B 79   5 NA  4
    # 6 BW-201 0B 79   6  1 NA

library(dplyr)
df1 <- df %>% filter(Bm != "NA") %>% mutate(row = 1:n()) %>% select(-Id)
df2 <- df %>% filter(Id != "NA") %>% mutate(row = 1:n()) %>% select(-Bm)
df3 <- full_join(df1,df2)
#Joining, by = c("VT", "Nm", "Tm", "row")
df3
#       VT Nm Tm row Bm Id
# 1 BW-201 0B 79   1 13 11
# 2 BW-201 0B 79   2 10  8
# 3 BW-201 0B 79   3  1  4