重命名数据框

时间:2016-08-11 06:10:26

标签: r dataframe

您好我正在尝试创建一个将接收数据帧的函数,并返回给定列的唯一值的数量。我设法将数据集转换为我喜欢的输出格式,但我似乎无法重命名其中一列(如输出中所示)。您对如何执行此操作有任何想法吗?我已尝试在as.data.frame中提供列名,但这样做无效。在查看数据框之后,它似乎应该使用fix.empty names参数,但即使在提供它之后,它似乎仍然给我一个空列名称(请参阅输出)。我认为这可能与此修复有关,但我不确定... http://r.789695.n4.nabble.com/Data-frame-printing-buglet-when-multiple-empty-column-names-td4718088.html感谢您的时间。

#Function to Find unique values in a dataframe
library(knitr)
library(formattable)
findUniqueVals <- function(df) {
  poop <- sapply(df, function(x) length(unique(x)))
  poop <- as.data.frame(poop, fix.empty.names==TRUE)
  kable(poop)
  #formattable::formattable(poop)
}
findUniqueVals(patientdata)
#should have a column header not just empty string
Output:
|             | poop|
|:------------|----:|
|patient.ID   |    4|
|patient.name |    4|
|Adm.Date     |    4|
|diabetes     |    2|
|p.status     |    3|

#testdata
patient.ID <- c(1, 2, 3, 4)
patient.name <-c("pat1", "pat2", "pat3","pat4")
Adm.Date <- as.POSIXct(c('2010-10-11','2008-3-25','2016-4-23','2011-6-12'))
diabetes <- c("Type1", "Type2", "Type1", "Type2")
p.status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patient.ID,patient.name,Adm.Date,diabetes,p.status)

2 个答案:

答案 0 :(得分:1)

我认为问题在于你没有使用该函数返回任何对象,并且里面的poop对象是一个5乘1的数据帧。要看这个用法,例如:

findUniqueVals <- function(df) {
  poop <- sapply(df, function(x) length(unique(x)))
  poop <- as.data.frame(poop)
  #formattable::formattable(poop)
  #kable(poop) commented this out because I don't have access to the package

  return(poop)   # returning the actual object
}

poop <- findUniqueVals(patientdata)
dim(poop)
colnames(poop) 
rownames(poop)

如果您想将rownames(poop)的输出作为实际列,则只需在函数中追加。

答案 1 :(得分:0)

这是我为那些感兴趣的人提出的最终代码:

据我所知,并非每个人都通过&lt;&lt; - 来全面分配全局,但我认为它简化了函数的输入,使代码更具可读性。

createmydf <- function(df) {
  #Create DF with column names
  #1.- Fill Data Frame Row name column with a vector of Column names
  #2.- Fill TCount with a vector of counts
  #3.- Display results using formattable
  x <<- data.frame("Row Name"= numeric(0), "TCount"=numeric(0))
  result <- sapply(df, function(x) length(unique(x)))

  #Now Create the Row names
  for (i in 1:length(colnames(df))) {
    x[i,1] <<- (names(result[i]))
    x[i,2] <<- result[[i]]
  }
  return(x)
}

正确的结果将输出如下:

     Row.Name TCount
1   patient.ID      4
2 patient.name      4
3     Adm.Date      4
4     diabetes      2
5     p.status      3