这应该是一个容易的问题,但我遇到了麻烦.我有一个脏的数据集,我无法阅读它header=T.在我阅读并清理它之后,我想使用现在的第一行数据作为列名.我在stackoverflow上尝试了多种方法但没有成功.可能是什么问题呢?t1清理后,数据集应如下所示:
V1 V2 V3 V4 V5
1 col1 col2 col3 col4
2 row1 2 4 5 56
3 row2 74 74 3 534
4 row3 865 768 8 7
5 row4 68 86 65 87
Run Code Online (Sandbox Code Playgroud)
我试过了:colnames(t1)=t1[1,].什么都没发生.
我试过:names(t1)=ti[1,],什么都没发生.
我试过了: lapply(t1, function(x) {names(x)<-x[1,]; x})
它返回一条错误消息:
误差在
[.default(X,1,):维度的数目不正确
有人可以帮忙吗?
zek*_*k19 35
Sam Firke 曾经很有用的包janitor有一个专门用于此的功能:row_to_names.
他的文档中的示例:
library(janitor)
x <- data.frame(X_1 = c(NA, "Title", 1:3),
X_2 = c(NA, "Title2", 4:6))
x %>%
row_to_names(row_number = 2)
Run Code Online (Sandbox Code Playgroud)
mpa*_*nco 11
数据框列的数据类型可能是因子。这就是您尝试的代码不起作用的原因,您可以使用str(df)以下方法进行检查:
stringsAsFactors = FALSE导入数据时使用参数:
df <- read.table(text = "V1 V2 V3 V4 V5
col1 col2 col3 col4 col5
row1 2 4 5 56
row2 74 74 3 534
row3 865 768 8 7
row4 68 86 65 87", header = TRUE,
stringsAsFactors = FALSE )
Run Code Online (Sandbox Code Playgroud)
然后你可以使用你的第一次尝试,如果你愿意,然后删除你的第一行:
colnames(df) <- df[1,]
df <- df[-1, ]
Run Code Online (Sandbox Code Playgroud)
如果您的列是因子或字符,它将起作用:
names(df) <- lapply(df[1, ], as.character)
df <- df[-1,]
Run Code Online (Sandbox Code Playgroud)
输出:
col1 col2 col3 col4 col5
2 row1 2 4 5 56
3 row2 74 74 3 534
4 row3 865 768 8 7
5 row4 68 86 65 87
Run Code Online (Sandbox Code Playgroud)
Kim*_*Kim 11
虽然 @sbha 已经提供了一个tidyverse解决方案,但我想留下一个完全可管道化的dplyr选项。我同意这应该是一个非常有用的功能。
library(dplyr)
data.frame(x = c("a", 1, 2, 3), y = c("b", 4, 5, 6)) %>%
`colnames<-`(.[1, ]) %>%
.[-1, ]
Run Code Online (Sandbox Code Playgroud)
header.true <- function(df) {
names(df) <- as.character(unlist(df[1,]))
df[-1,]
}
Run Code Online (Sandbox Code Playgroud)
测试
df1 <- data.frame(c("a", 1,2,3), c("b", 4,5,6))
header.true(df1)
a b
2 1 4
3 2 5
4 3 6
Run Code Online (Sandbox Code Playgroud)
怎么样:
my.names <- t1[1,]
colnames(t1) <- my.names
Run Code Online (Sandbox Code Playgroud)
即专门将该行命名为变量?
使用以下代码:
namex <-c("col1","col2","col3","col4")
row1 <- c(2, 4, 5, 56)
row2 <- c(74, 73, 3, 534)
row3 <- c(865, 768, 8, 7)
row4 <- c(68, 58, 65, 87)
t1 <- data.frame(namex, row1, row2, row3, row4)
t1 <- t(t1)
my.names <- t1[1,]
colnames(t1) <- my.names
Run Code Online (Sandbox Code Playgroud)
它似乎有效,但也许我错过了一些东西?
小智 6
你几乎做到了,只是错过了用 c 调用向量
colnames(t1)=t1[c(1),]
Run Code Online (Sandbox Code Playgroud)
然后你可以删除第一行,因为现在它加倍了
t1=t1[-c(1),]
Run Code Online (Sandbox Code Playgroud)
退一步,当你读你的数据使用skip=1中read.table完全错过了第一线。当您清理数据时,这应该会让生活更轻松一些,尤其是对于数据类型。这是关键,因为您的问题源于您的数据被编码为因子。
然后,您可以使用nrows=1in分别读入您的列名read.table。
| 归档时间: |
|
| 查看次数: |
31254 次 |
| 最近记录: |