SQL / R:连接2个表,使得第2个表的属性值成为第一个表的属性

时间:2015-02-03 05:33:55

标签: sql r join

当连接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查询可以帮助我轻松实现这一目标?任何帮助表示赞赏:)

2 个答案:

答案 0 :(得分:1)

您可以使用dplyrtidyr。例如,使用此输入

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
相关问题