【问题标题】:basic R question on manipulating dataframes关于操作数据框的基本 R 问题
【发布时间】:2010-09-01 07:49:13
【问题描述】:

我有一个包含几列的数据框。行有名字。

我想为每一行计算一些值 (col1/col2) 并使用原始行名创建一个新数据框。如果我只是执行data$col1/data$col2 之类的操作,我会得到一个带有结果的向量,但会丢失行名。

我知道这是非常基本的,但我对 R 很陌生。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    阅读?"[.data.frame" 以了解发生了什么会有所帮助。具体来说:

    请注意,没有“data.frame” '$' 的方法,所以'x$name' 使用 默认方法将“x”视为 列表。

    如果将 data.frame 转换为列表(使用 Joris 的示例数据),您将看到对象的名称丢失了:

    > as.list(Data)
    $col1
     [1] -0.2179939 -2.6050843  1.6980104 -0.9712305  1.6953474  0.4422874
     [7] -0.5012775  0.2073210  1.0453705 -0.2883248
    
    $col2
     [1] -1.3623349  0.4535634  0.3502413 -0.1521901 -0.1032828 -0.9296857
     [7]  1.4608866  1.1377755  0.2424622 -0.7814709
    

    如果您想保留行名,我的建议是避免使用$。改用这个:

    > Data["col1"]/Data["col2"]
             col1
    a   0.1600149
    b  -5.7435947
    c   4.8481157
    d   6.3816918
    e -16.4146120
    f  -0.4757387
    g  -0.3431324
    h   0.1822161
    i   4.3114785
    j   0.3689514
    

    【讨论】:

    • 乔希,用 ["name"] 代替 $name 有什么好处?我倾向于使用后者,我看到你更喜欢前者。我的偏好仅来自习惯,而不是有意识的决定。
    • @JD 我实际上不喜欢前者。我经常使用$$<-,但我不关心行名......这是使用[.data.frame 的优势(它不会删除行名)。
    • 哦,你在回答中说“行名”,但不知何故它没有在我的脑海中登记。是的,我现在看到了。抱歉这么密集;)
    【解决方案2】:

    使用函数 names() 添加名称:

    Data <- data.frame(col1=rnorm(10),col2=rnorm(10),row.names=letters[1:10])
    x <- Data$col1/Data$col2
    names(x) <- row.names(Data)
    

    这个解决方案给出了一个带有名称的向量。获取数据框(Marek 的解决方案):

    NewFrame <- data.frame(x=Data$col1/Data$col2,row.names=row.names(Data))
    

    【讨论】:

    • 你错过了data.frame关键字。
    【解决方案3】:

    一个非常简单整洁的方法是使用 row.names(data frame) 将其存储为列并进一步操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2021-02-02
      • 2019-04-21
      • 2021-03-09
      • 2017-06-27
      相关资源
      最近更新 更多