我在r
中有以下数据框 Company Education Health
A NA 1
A 1 2
A 1 NA
我希望以下列格式计算每列(1,2,NA)中的级别
Company Education_1 Education_NA Health_1 Health_2 Health_NA
A 2 1 1 1 1
我怎样才能在R?
中完成答案 0 :(得分:6)
您可以执行以下操作:
library(tidyverse)
df %>%
gather(k, v, -Company) %>%
unite(tmp, k, v, sep = "_") %>%
count(Company, tmp) %>%
spread(tmp, n)
## A tibble: 1 x 6
# Company Education_1 Education_NA Health_1 Health_2 Health_NA
# <fct> <int> <int> <int> <int> <int>
#1 A 2 1 1 1 1
df <- read.table(text =
" Company Education Health
A NA 1
A 1 2
A 1 NA ", header = T)
答案 1 :(得分:2)
在我们添加公司B的末尾的注释中使用DF
并使用reshape2包,可以在一次重新调用中完成。可以省略id.var
和fun
参数,并给出相同的答案,但会产生一条消息,说明它使用了这些默认值。
library(reshape2)
recast(DF, Company ~ variable + value,
id.var = "Company", fun = length)
给出这个数据框:
Company Education_1 Education_NA Health_1 Health_2 Health_NA
1 A 2 1 1 1 1
2 B 2 1 1 1 1
Lines <- " Company Education Health
1 A NA 1
2 A 1 2
3 A 1 NA
4 B NA 1
5 B 1 2
6 B 1 NA"
DF <- read.table(text = Lines)
答案 2 :(得分:1)
在plyr
中,您可以通过转置表来使用ddply
的hack来获取看似新列的内容:
x <- data.frame(Company="A",Education=c(NA,1,1),Health=c(1,2,NA))
library(plyr)
ddply(x,.(Company),plyr::summarise,
Education=t(table(addNA(Education))),
Health=t(table(addNA(Health)))
)
Company Education.1 Education.NA Health.1 Health.2 Health.NA
1 A 2 1 1 1 1
但是,它们不是真正的列,而是data.frame中的表元素。
您可以使用do.call(data.frame,y)
构造使它们成为正确的数据框列,但您需要多行才能生效。