从现有数据框列分配行名时出错

Error with assigning row names from existing dataframe column

我将物理测量值放入 csv,然后导入 R 进行计算。我找到了这些测量值的平均值和标准差,并将值为 NaN 的标准差指定为零。

第一列包含不同材料的(唯一)名称,我试图将此列指定为行名称。这会出现错误:无效的 'row.names' 长度,尽管我使用的是数据帧中的第一列。

data <- read.csv("my.csv", header = TRUE, fileEncoding = "UTF-8-BOM")
data <- data.frame(data)  %>% select_if(~sum(!is.na(.)) > 0) 
data_ave <- data %>% group_by(material) %>% summarise(mean_width = mean(width_cm), std_width = sd(width_cm))
data_ave$std[is.nan(data_ave$std_width)] <- 0
rownames(data_ave) <- data_ave[,1]

Error in `.rowNamesDF<-`(x, value = value) : invalid 'row.names' length

另外:

nrow(data_ave[,1])==nrow(data_ave)

TRUE

我已经对另一个数据框成功使用了类似的方法,然后简单地删除了第一列。他们怎么能有相同的行数,而 row.names 的长度是这里的问题?

干杯帮助

很可能是因为 data_ave 是一个 tibble。您也不能在 tibble 上设置行名 data_ave[, 1] 会 return 向后倾斜,这与数据帧不同 return 一个向量。

这可以用这个例子来证明。

library(dplyr)

data_ave <- mtcars %>%
                group_by(cyl) %>%
                summarise(mpg = mean(mpg))
rownames(data_ave) <- data_ave[, 1]

Error in .rowNamesDF<-(x, value = value) : invalid 'row.names' length In addition: Warning message: Setting row names on a tibble is deprecated.

解决方案是将 data_ave 更改为数据框。

data_ave <- data.frame(data_ave)
rownames(data_ave) <- data_ave[, 1]
data_ave

#  cyl      mpg
#4   4 26.66364
#6   6 19.74286
#8   8 15.10000