我有数据框df_a之类的数据,并希望将其转换为数据框df_b中的格式。
xtabs()给出了类似的结果,但是我没有找到下面的示例代码中那样访问元素的方法。通过xa [1,1]进行访问没有任何好处,因为按数字(“ 1”)和名称(“ A”)进行索引之间的关联很弱。如您所见,xtabs()结果存在排序差异,因此xa [2,2] = 2而不是df_b列表中的0。
> df_a
ItemName Feature Amount
1 First A 2
2 First B 3
3 First A 4
4 Second C 3
5 Second C 2
6 Third D 1
7 Fourth B 2
8 Fourth D 3
9 Fourth D 2
> df_b
ItemName A B C D
1 First 6 3 0 0
2 Second 0 0 5 0
3 Third 0 0 0 1
4 Fourth 0 2 0 5
> df_b$A
[1] 6 0 0 0
> xa<-xtabs(df_a$Amount~df_a$ItemName+df_a$Feature)
> xa
df_a$Feature
df_a$ItemName A B C D
First 6 3 0 0
Fourth 0 2 0 5
Second 0 0 5 0
Third 0 0 0 1
> xa$A
Error in xa$A : $ operator is invalid for atomic vectors
有一种使用for()循环进行迭代转换的方法,但由于我的数据有数百万条记录,因此在我的情况下完全没有效率。
为了进一步处理,我需要的输出格式是dataframe。 如果有人解决了类似的问题,请分享。
答案 0 :(得分:1)
您可以只使用as.data.frame.matrix(xa)
# output
A B C D
First 6 3 0 0
Fourth 0 2 0 5
Second 0 0 5 0
Third 0 0 0 1
## or
df_b <- as.data.frame.matrix(xa)[unique(df_a$ItemName), ]
data.frame(ItemName = row.names(df_b), df_b, row.names = NULL)
# output
ItemName A B C D
1 First 6 3 0 0
2 Second 0 0 5 0
3 Third 0 0 0 1
4 Fourth 0 2 0 5
答案 1 :(得分:1)
无需使用xtabs
,您可以执行以下操作:
df %>%
dplyr::group_by(ItemName, Feature) %>%
dplyr::summarise(Sum=sum(Amount, na.rm = T)) %>%
tidyr::spread(Feature, Sum, fill=0) %>%
as.data.frame()
这将根据您的需要进行转换,并保持为data.frame
或者,您也可以as.data.frame(your_xtabs_result)
,它也应该起作用