矩阵转换为数据框

3

I have this code:

df<-data.frame(a=c(1,2,2,2,2), b=c(2,2,2,2,1), c=c(3,3,3,3,4), d=c(6,6,6,6,7))

tblFun <- function(x){
  tbl <- table(x)
  res <- cbind(tbl,round(prop.table(tbl)*100,2))
  colnames(res) <- c('Count','Percentage')
  res
}

If I ran:

do.call(rbind,lapply(df,tblFun))

最初的回答:
我收到以下信息:
  Count Percentage
1     1         20
2     4         80
1     1         20
2     4         80
3     4         80
4     1         20
6     4         80
7     1         20

最初的回答是:但如果我运行以下命令:
as.data.frame(do.call(rbind,lapply(df,tblFun)))

最初的回答:

我收到:

     Count Percentage
X1       1         20
X2       4         80
X1.1     1         20
X2.1     4         80
X3       4         80
X4       1         20
X6       4         80
X7       1         20

我想修改代码,使得第一列的数据框像在控制台中看到的输出一样(而不是我们使用View()看到的矩阵的实际内容!),这可以如何实现?

请问该怎么做呢?


将其转换为tibble as_tibble(do.call(rbind, lapply(df, tblFun))) - akrun
1个回答

2

这是由于行名重复(在data.frame中,不允许行名重复),因此使用make.unique进行修改。根据?data.frame

如果设置check.rows-TRUE,则会检查行的长度和名称是否一致。

"Original Answer"翻译成"最初的回答"。

out <- do.call(rbind,lapply(df,tblFun))
row.names(out) <- NULL
as.data.frame(out)
# Count Percentage
#1     1         20
#2     4         80
#3     1         20
#4     4         80
#5     4         80
#6     1         20
#7     4         80
#8     1         20

如果我们确实需要行名作为索引,请在将row.names赋值为NULL之前,将其创建为一列。最初的回答。
out <- do.call(rbind,lapply(df,tblFun))
out <- cbind(index = as.numeric(row.names(out)), out)
row.names(out) <- NULL
as.data.frame(out)
#. index Count Percentage
31     1     1         20
#2     2     4         80
#3     1     1         20
#4     2     4         80
#5     3     4         80
#6     4     1         20
#7     6     4         80
#8     7     1         20

你的代码删除了在控制台输出的矩阵信息(它不显示行索引,而是显示被测试的变量值)。 - vasili111
1
@vasili111. 你可能需要创建一个索引列,否则不允许重复的行名。 - akrun
2
还有rbind.data.frame函数。在第一个代码示例中,它将节省一行代码:do.call(rbind.data.frame, lapply(df, tblFun)) - Rui Barradas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接