当连接2个表时,我想将记录值转换为属性。 (即我有这两张桌子):
客户表:
|CustomerId| Name|
|1 |Abc |
|2 |Xyz |
我有食物偏好表:
|CustomerId|Preference |
|1 |Continental|
|1 |Italian |
|2 |Italian |
|2 |Indian |
|2 |Chinese |
现在我想将2个表加入下表:
|CustomerId|Name|Food-Continental|Food-Italian|Food-Indian|Food-Chinese|
|1 |Abc |TRUE |TRUE |FALSE |FALSE |
|1 |Xyz |FALSE |TRUE |TRUE |TRUE |
R中是否有脚本或SQL查询可以帮助我轻松实现这一目标?任何帮助表示赞赏:)
答案 0 :(得分:1)
您可以使用dplyr
和tidyr
。例如,使用此输入
a<-read.table(text="CustomerId Name
1 Abc
2 Xyz", header=T)
b<-read.table(text="CustomerId Preference
1 Continental
1 Italian
2 Italian
2 Indian
2 Chinese", header=T)
然后你可以做
library(dplyr)
library(tidyr)
inner_join(a, b) %>% mutate(val=TRUE) %>%
spread(Preference, val, fill=FALSE)
哪个产生
CustomerId Name Chinese Continental Indian Italian
1 1 Abc FALSE TRUE FALSE TRUE
2 2 Xyz TRUE FALSE TRUE TRUE
如果您真的需要,可以更改列名称和顺序,但这应该可以为您提供数据。
转换分两步完成。首先,我们做一个标准合并它的数据。这导致“长”格式的数据集。然后,我们使用spread
将长数据重新整形为宽格式。
答案 1 :(得分:0)
我已经得到了你要求使用 MSSQL 的内容。试试吧。
SELECT
CustomerID,
Name,
CASE WHEN Continental='Continental' Then 'TRUE' ELSE 'FALSE' END AS [Food-Continental],
CASE WHEN Italian='Italian' Then 'TRUE' ELSE 'FALSE' END AS [Food-Italian],
CASE WHEN Indian='Indian' Then 'TRUE' ELSE 'FALSE' END [Food-Indian],
CASE WHEN Chinese='Chinese' Then 'TRUE' ELSE 'FALSE' END [Food-Chinese]
FROM (
SELECT
A.CustomerID,Name,Preference
FROM customer A
LEFT JOIN
food B on A.CustomerID=B.CustomerID) AS C
PIVOT(
MIN(Preference) FOR Preference IN ([Continental],[Italian],[Indian],[Chinese])
)AS PVT