将行数据转换为带键列的单列
Posted
技术标签:
【中文标题】将行数据转换为带键列的单列【英文标题】:Convert Row Data into Single Column w/ Key Column 【发布时间】:2020-10-02 17:49:00 【问题描述】:我想使用 SQL 或 R 将原始行数据中的行数据转换为具有键列的单列。
示例行:
---------------------------------------------------------------------
| Customer # | Item1 | Item2 | Item3 | Item4 |
---------------------------------------------------------------------
| 1111111 | A12345 | C45567 | G34589 | A34529 |
---------------------------------------------------------------------
这是我想要的结果:
-------------------------------
| Customer # | Columnname | Value |
-------------------------------
| 1111111 | Item1 | A12345 |
| 1111111 | Item2 | C45567 |
| 1111111 | Item3 | G34589 |
| 1111111 | Item4 | A34529 |
【问题讨论】:
在 R 中,您可以直接使用reshape
: reshape(df, varying=names(df)[-1], times=names(df)[-1], v.names="Value", timevar="Columnname", ids=NULL, new.row.names=1:1E5, direction="long")
。
【参考方案1】:
您希望将表中的列反透视为行。
您标记了问题mysqli
,所以让我假设您使用的是 MySQL。在这个数据库中,你可以使用union all
:
select customer, 'Item1' columname, Item1 value from mytable
union all select customer, 'Item2', Item2 from mytable
union all select customer, 'Item3', Item3 from mytable
union all select customer, 'Item4', Item4 from mytable
其他数据库有更简洁的解决方案,通常使用横向连接和values()
。以 Postgres 为例:
select t.customer, x.columname, x.value
from mytable t
cross join lateral (values
('Item1', Item1), ('Item2', Item2), ('Item3', Item3), ('Item4', Item4)
) x(columname, value)
在 SQL Server 中,您只需将 cross join lateral
替换为 cross apply
。
【讨论】:
【参考方案2】:在 R 中,您可以使用 dplyr 和 tidyr,如下所示。
library(dplyr)
library(tidyr)
data <- tibble(customer = c(11111),
item1 = c('sfdhdshv'),
item2 = c('dfh'),
item3 = c('kjg'))
data
# customer item1 item2 item3
# <dbl> <chr> <chr> <chr>
# 1 11111 sfdhdshv dfh kjg
data %>%
pivot_longer(!customer, names_to = 'columnname', values_to = 'value')
# customer columnname value
# <dbl> <chr> <chr>
# 1 11111 item1 sfdhdshv
# 2 11111 item2 dfh
# 3 11111 item3 kjg
【讨论】:
r
中的关键是你不能有一个名为customer #
的列,#
不能在那里
data.frame('Customer #' = 1, check.names = FALSE)[, 'Customer #']
@ChuckP
哈哈,好吧,是的,你可以四处走走,但你在路上自找麻烦以上是关于将行数据转换为带键列的单列的主要内容,如果未能解决你的问题,请参考以下文章