这是我从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.
请建议,非常感谢。
答案 0 :(得分:1)
数据中没有足够的列来唯一标识key:value
对。解决方案是添加一个带行号的col。然后使用dplyr
至filter
和join
删除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