将数行中的数据分成一行和一列

时间:2017-09-13 14:58:17

标签: r

我有一张表,其中数据以下列模式存储:

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 不太熟悉,所以没有太多新库的简单解决方案是首选。

2 个答案:

答案 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

可以使用10替换值:

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