我有一张表,其中数据以下列模式存储:
ID Account
1 A
1 B
2 B
3 A
4 A
4 B
我希望以下列方式为每个ID获取一行:
ID Account_A Account_B
1 1 1
2 0 1
3 1 0
4 1 1
0和1并不重要,可以是As,Bs等。主要问题是每个ID将数据放入一行,这样我就可以将它与另一个表合并。
我对 R 不太熟悉,所以没有太多新库的简单解决方案是首选。
答案 0 :(得分:2)
以下是基本R函数reshape
的解决方案。
数据:
dat <- data.frame(ID = c(1, 1, 2, 3, 4, 4), Account = c("A", "B", "B", "A", "A", "B"))
使用reshape
将数据转换为宽格式。
dat_wide <- reshape(dat, direction = "wide", v.names = "Account", idvar = "ID",
timevar = "Account", sep = "_")
dat_wide
# ID Account_A Account_B
# 1 1 A B
# 3 2 <NA> B
# 4 3 A <NA>
# 5 4 A B
可以使用1
和0
替换值:
dat_wide[-1] <- as.integer(!is.na(dat_wide[-1]))
# ID Account_A Account_B
# 1 1 1 1
# 3 2 0 1
# 4 3 1 0
# 5 4 1 1
答案 1 :(得分:1)
我们需要table()
,然后美化以匹配预期的输出。
注意:我正在使用新的示例数据来匹配OP关于重复行的请求。
PrzeM commented: 还有一个问题 - 是否可以将此代码与计数结合起来 发生的次数?在另一个数据框架中,我有一个类似的布局, 但是对于给定的示例,帐户“A”可以多次出现同样的情况 ID,然后我想得到一个类似的摘要,但结果 类似于在Excel中使用COUNT()函数。
# based on OP comments new example data
df1 <- read.table(text = "ID Account
1 A
1 A
9 B
9 B
3 A
4 A
4 B", header = TRUE)
# get table and convert to a dataframe
myTable <- table(df1)
res <- as.data.frame.matrix(myTable)
res
# A B
# 1 2 0
# 3 1 0
# 4 1 1
# 9 0 2
# update column names for Accounts
colnames(res) <- paste("Account", colnames(res), sep = "_")
# ID is in rownames, add it back as new column
res$ID <- rownames(res)
# reorder columns to get desired output
res <- res[, c(3, 1, 2)]
rownames(res) <- NULL
res
# ID Account_A Account_B
# 1 1 2 0
# 2 3 1 0
# 3 4 1 1
# 4 9 0 2