我有一个表格,其标题看起来像这样(我简化了它):
id, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10
Run Code Online (Sandbox Code Playgroud)
其中除id之外的每一行都是一个分类变量.我们将类别命名为A,B,C,D,E.
我想为一些列创建一个列联表,如下所示(为简洁起见,我没有在单元格中放置样本号).获得总列/行会很棒,但不是强制性的,我可以稍后自己计算.
a1 a2 a3 a4 Total
----------------------
A|
B|
C|
D|
E|
Total|
Run Code Online (Sandbox Code Playgroud)
因此,问题是如何基于R中的多个列创建交叉表?我用table()和xtabs()看过的例子只使用了一列.在我的例子中,列是相邻的,因此一个交叉表将汇总列a1..a4,另一个列为a5..a7,依此类推.我希望有一种优雅的方式来做到这一点.
我是程序员,但是R的新手
先感谢您.
我正在尝试创建一个动态系统,允许用户从Excel导入数据列表,所以我需要有动态列,例如:
custom_columns_table
id list_id data_type column_name data ....
1 1 VARCHAR(255) email jhon@example.com ....
2 1 VARCHAR(255) name Jhon ....
list_table
id
1
Run Code Online (Sandbox Code Playgroud)
我需要这样的结果:
id email name ....
1 jhon@example.com Jhon ....
Run Code Online (Sandbox Code Playgroud)
我找到了一些使用交叉表的例子,但我不知道它是否适用于这种情况.
有谁知道我该怎么做?
我正在尝试在SQL Server 2008 R2中做一些交叉表.那部分没关系,但是,如果我试图获得每个单元格的百分比,我就会遇到问题.
这是一个蒸馏用例:一项调查,人们给出他们喜欢的颜色和他们喜欢的水果.我想知道有多少像给定的水果和给定的颜色:
with survey as (
select 'banana' fav_fruit, 'yellow' fav_color
union select 'banana', 'red'
union select 'apple', 'yellow'
union select 'grape', 'red'
union select 'apple', 'blue'
union select 'orange', 'purple'
union select 'pomegranate', 'green'
)
select
s.fav_color,
sum(case
when s.fav_fruit = 'banana' then 1
else 0
end) as banana,
sum(case
when s.fav_fruit = 'banana' then 1
else 0
end) / sum(1) -- why does division always yield 0? "+", "-", and "*" all behave as expected. …Run Code Online (Sandbox Code Playgroud) 我想使用第三列来加权熊猫交叉表中的结果。
例如,以下内容:
import pandas as pd
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'bar'],
'B': [1, 1, 0, 0, 0],
'weight': [2, 3, 4, 5, 6]})
print(pd.crosstab(df.A, df.B))
Run Code Online (Sandbox Code Playgroud)
结果是:
B 0 1
A
bar 2 1
foo 1 1
Run Code Online (Sandbox Code Playgroud)
我想要的结果是:
B 0 1
A
bar 11 3
foo 4 2
Run Code Online (Sandbox Code Playgroud) 考虑以下示例:
tab <- table(mtcars$vs, mtcars$cyl, dnn = c("vs", "cylinder"))
prop.table(tab)
# cylinder
# vs 4 6 8
# 0 0.03125 0.09375 0.43750
# 1 0.31250 0.12500 0.00000
round(prop.table(tab)*100, 1)
# cylinder
# vs 4 6 8
# 0 3.1 9.4 43.8
# 1 31.2 12.5 0.0
Run Code Online (Sandbox Code Playgroud)
期望的输出:
# cylinder
# vs 4 6 8
# 0 3.1% 9.4% 43.8%
# 1 31.2% 12.5% 0.0%
Run Code Online (Sandbox Code Playgroud)
scales::percent(round(prop.table(tab))) 不起作用,因为没有适用的方法应用于plyr::round_any()class 的对象table。
我知道我缺少一个简单的解决方法。或者也许一个简单的包装器或拉取请求plyr::round_any()可以为每个人解决这个问题?
我正在使用postgresql 9.3.9.
我CREATE EXTENSION tablefunc;成功了.现在,当我尝试进行简单的交叉表查询时,例如:
select * from crosstab('select col_1, col_2 from table order by 1,2')
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error in query: ERROR: function crosstab(unknown) does not exist
HINT: No function matches the given name and argument types. You might need to add explicit type casts
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我尝试在文本中添加显式强制转换,但这没有帮助.
如何crosstab在postgresql. 请参考postgresql中的以下功能
create function sp_nextfollowup_count_byweek(_from timestamp without time zone,_to timestamp without time zone)
returns table(userid integer,username character varying,day1 bigint,day2 bigint,day3 bigint,day4 bigint,day5 bigint,day6 bigint,day7 bigint)as
$BODY$
BEGIN
return query
with cte as(
select * from crosstab($$
select follow_up_by,next_follow_up_date,count(*) from sales_enquiry_follow_up where next_follow_up_date between _from and _to
group by follow_up_by,next_follow_up_date
order by follow_up_by,next_follow_up_date$$,$$select date::timestamp without time zone
from generate_series(
_from,
_to,
'1 day'::interval
) date$$)
as(id integer, dd bigint,dd1 bigint,dd2 bigint,dd3 bigint,dd4 bigint,dd5 bigint,dd6 bigint)
)
select …Run Code Online (Sandbox Code Playgroud) 我有一张“瘦高”事实表:
CREATE TABLE facts(
eff_date timestamp NOT NULL,
update_date timestamp NOT NULL,
symbol_id int4 NOT NULL,
data_type_id int4 NOT NULL,
source_id char(3) NOT NULL,
fact decimal
/* Keys */
CONSTRAINT fact_pk
PRIMARY KEY (source_id, symbol_id, data_type_id, eff_date),
)
Run Code Online (Sandbox Code Playgroud)
我想“透视”这个报告,所以标题看起来像这样:
eff_date, symbol_id, source_id, datatypeValue1, ... DatatypeValueN
Run Code Online (Sandbox Code Playgroud)
即,对于 eff_date、symbol_id 和 source_id 的每个唯一组合,我想要一行。
但是,postgresql crosstab() 函数只允许键列。
有任何想法吗?
我想在 Python 中执行一个具有交叉表功能的 SQL 查询,但是我收到以下错误消息:
psycopg2.ProgrammingError:函数交叉表(未知,未知)不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
有解决方法吗?我已经尝试升级 psycopg2(pip install psycopg2 --upgrade)。非常感谢
鉴于以下数据:
pd.DataFrame(dict(
name = ['a', 'a', 'a', 'b', 'b', 'b'],
vals = [1, 2 , 3, 99, 3, 4]
))
Run Code Online (Sandbox Code Playgroud)
看起来像:
name vals
0 a 1
1 a 2
2 a 3
3 b 99
4 b 3
5 b 4
Run Code Online (Sandbox Code Playgroud)
我想知道如何创建以下内容:
1 2 3 4 99
a true true true false false
b false false true false true
Run Code Online (Sandbox Code Playgroud)
注意 -上面的true和的确切值false并不那么重要,我目前不知道如何创建这种类型的表。
crosstab ×10
postgresql ×4
python ×3
sql ×3
pandas ×2
r ×2
division ×1
formatting ×1
percentage ×1
plyr ×1
psycopg2 ×1
row ×1
scipy ×1
sql-server ×1
statsmodels ×1