无法将值从 MySQL 传递到 tidyr::spread
Fail to passing value from MySQL to tidyr::spread
这是我从 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()
它returns上面的数据,但是当我尝试传播它时,它就出错了
con %>% tbl("vt") %>% head() %>% tbl_df() %>% spread("Unt","Val")
Error: Duplicate identifiers for rows (2, 4, 6), (1, 3, 5)
无论是我quote/unquote,还是spread/spread_,都只是出错了。
顺便说一句,如果我不使用 tbl_df(),它会 returns、
Error: Key column 'Unt' does not exist in input.
请多多指教,万分感谢
数据中没有足够的列来唯一标识 key:value
对。解决方案是添加一个带有行号的列。然后使用 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
这是我从 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()
它returns上面的数据,但是当我尝试传播它时,它就出错了
con %>% tbl("vt") %>% head() %>% tbl_df() %>% spread("Unt","Val")
Error: Duplicate identifiers for rows (2, 4, 6), (1, 3, 5)
无论是我quote/unquote,还是spread/spread_,都只是出错了。 顺便说一句,如果我不使用 tbl_df(),它会 returns、
Error: Key column 'Unt' does not exist in input.
请多多指教,万分感谢
数据中没有足够的列来唯一标识 key:value
对。解决方案是添加一个带有行号的列。然后使用 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