【问题标题】:Naming and adding columns to a dataframe为数据框命名和添加列
【发布时间】:2014-10-08 17:20:16
【问题描述】:

我正在将各种文本文件合并到一个数据框中,

到现在为止

files = list.files()
data = lapply(files,function(x) read.table(x)) 
data_rbind <- do.call("rbind", data)

我想添加列标题, 我试过了

colnames(data_rbind)=c('car','colour','price')

但是,这会给出错误消息

colnames&lt;-(*tmp*, value = c("car", "color", "price")) 中的错误: 'names' 属性 [3] 必须与向量 [1] 长度相同

然后我想添加一个名为“年份”的第 4 列,其值对应于每个文件的名称。这可能吗?

edit-我已经意识到上述错误是因为我的数据框在应该为 3 时读取为只有 1 个变量。这 3 列似乎都包含在 1 列中。我不知道为什么会这样。

我想将数据分成 3 个单独的列并用于读取结构函数

data.frame':    9001 obs. of  3 variables:
 $ V1: chr  "Toyota" "BMW" "Ford" ...
 $ V2: chr  "Blue" "Red" "Red" "Silver" ...
 $ V3: int  80412 65443 47920 41560 38019 29618 29074 28885 26159 25693 ...

我正在处理 txt 文件,每个文件都有许多行,其中包含用逗号分隔的 3 个值, 例如,

福特,红色,8041

丰田,银,6544

宝马,红色,4792

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    该错误表明您的名称向量与数据框中的列数长度不同。如果要设置特定列的名称,请执行以下操作

    #assume car, colour, and price correspond to columns 1, 3, 4
    colnames(dataframe)[c(1,3,4)]<-c("car", "colour", "price")
    

    如果你想添加一个标题为Year的列,你可以添加它

    df$Year<-values
    

    尽管您需要确保 values 中的条目数等于 df 中的行数以获得所需的结果。该列的名称将是“年份”

    只是为了证明它有效,我根据问题提供的示例制作了一个简单的 txt 文件。在 lapply 之后我得到了

    #[[1]]
    #      V1     V2   V3
    #1   Ford    Red 8041
    #2 Toyota Silver 6544
    #3    BMW    Red 4792
    #
    #[[2]]
    #      V1     V2   V3
    #1   Ford    Red 8041
    #2 Toyota Silver 6544
    #3    BMW    Red 4792
    #
    #[[3]]
    #      V1     V2   V3
    #1   Ford    Red 8041
    #2 Toyota Silver 6544
    #3    BMW    Red 4792
    

    然后在 do.call 之后

    #      V1     V2   V3
    #1   Ford    Red 8041
    #2 Toyota Silver 6544
    #3    BMW    Red 4792
    #4   Ford    Red 8041
    #5 Toyota Silver 6544
    #6    BMW    Red 4792
    #7   Ford    Red 8041
    #8 Toyota Silver 6544
    #9    BMW    Red 4792
    

    然后我们可以更改列名,不必要地明确索引

    colnames(dataframe)[c(1,2,3)]<-c("car", "color", "price")
    

    我们也可以添加年份

    dataframe$Year<-1 #all years are 1
    
    #     car  color price Year
    #1   Ford    Red  8041    1
    #2 Toyota Silver  6544    1
    #3    BMW    Red  4792    1
    #4   Ford    Red  8041    1
    #5 Toyota Silver  6544    1
    #6    BMW    Red  4792    1
    #7   Ford    Red  8041    1
    #8 Toyota Silver  6544    1
    #9    BMW    Red  4792    1
    

    这是 lapply 调用后的数据输入

    list(structure(list(V1 = c("Ford", "Toyota", "BMW"), V2 = c("Red", 
    "Silver", "Red"), V3 = c(8041L, 6544L, 4792L)), .Names = c("V1", 
    "V2", "V3"), class = "data.frame", row.names = c(NA, -3L)), structure(list(
        V1 = c("Ford", "Toyota", "BMW"), V2 = c("Red", "Silver", 
        "Red"), V3 = c(8041L, 6544L, 4792L)), .Names = c("V1", "V2", 
    "V3"), class = "data.frame", row.names = c(NA, -3L)), structure(list(
        V1 = c("Ford", "Toyota", "BMW"), V2 = c("Red", "Silver", 
        "Red"), V3 = c(8041L, 6544L, 4792L)), .Names = c("V1", "V2", 
    "V3"), class = "data.frame", row.names = c(NA, -3L)))
    

    【讨论】:

    • “名称向量”到底是什么意思?我刚刚检查了结构,它告诉我我只有 1 个变量,而我应该有 3 个。有没有办法修改我上面的代码,将它分成 3 个变量?我试过 "data = lapply(files,header=FALSE,sep=",",function(x) read.table(x))" 但得到错误 "Error in FUN(c("abc.txt", "def .txt", "ghi.txt", "jkl.txt", : 未使用的参数 (header = FALSE, sep = ",")"
    • 我不确定您的数据到底是什么,您需要发布一个示例。通过名称向量,我的意思是这个。以您有一个包含 A、B 和 C 列的数据框为例。您想将 B 列和 C 列的名称分别更改为 X 和 Y,那么您的名称向量将为 c("X", "Y ") 并且您可以通过 colnames(dataframe)[c(2,3)] 更改列名
    • 这也不是为 read.table 调用 lapply 的正确方法。你应该做 lapply(files, read.table, header=FALSE, sep=","),传递给你正在应用的函数的其他参数在函数之后指定
    • 嗨,我现在知道为什么会出现错误 - 一列中应该包含 3 列数据。我对 R 还是很陌生,所以我不知道为什么会这样。如果我弄清楚如何将数据分成单独的列,您的代码应该可以工作......
    • @perriebtee 你的每个文件都有一列数据吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2016-08-29
    • 2018-12-24
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多