【问题标题】:R Programming - Prevent "apply" from repeating results beyone the range of dataR Programming - 防止“应用”重复超出数据范围的结果
【发布时间】:2013-04-11 14:39:50
【问题描述】:

我有一个数据集(在数据框中)。我正在使用 apply 向数据集中添加一个新列,其中新列的行使用该行中其他列的元素执行一个函数。 Apply 有效,但在将函数应用到每一行之后,它会继续超出范围,只是一遍又一遍地应用值。

这是我开始的数据:

Abbreviation    Name    X    Y    Z     A    B    C
JM              Jim     3    4    5     6    7    8
JS              Jess    5    6    7     8    9    10

使用以下命令,我得到以下结果: 命令:

df_new$Test <- apply(df_new,1, function(row) (df_new[,8]/df_new[,6])/(df_new[,5]/df_new[,3]))

返回的数据(来自 View(df_new))

Abbreviation    Name    X    Y    Z     A    B    C     Test
JM              Jim     3    4    5     6    7    8     .8
JS              Jess    5    6    7     8    9    10    .89
                                                        .8
                                                        .89
                                                        .8
                                                        .89

此外,当我使用以下命令将此数据写入 csv 时,会得到以下输出: 命令:

write.csv(df_new,file="Df_new.csv", row.names=FALSE)

Abbreviation    Name    X    Y    Z     A    B    C     Test Test.1  Test.2    Test.3
JM              Jim     3    4    5     6    7    8     .8   .8      .8        .8
JS              Jess    5    6    7     8    9    10    .89  .89     .89       .89 

理想情况下,从上面,我只想要 df_new[1:2,1:9];但是,即使尝试创建仅保留该信息的对象,仍然会导致额外的行(在 View(df_new) 中)或额外的列(写入 .csv 时)。

【问题讨论】:

  • 您能否发布dput(df_new) 的结果以使其可重现?
  • @DavidRobinson 数据发布在问题中?只需使用read.table( text = " copy/paste here " , h = T )
  • @DavidRobinson,这是我从 dput 得到的,尽管 Dason 的解决方案确实对我有用。 > dput(df_new)结构(列表(缩写=结构(1:2,.Label = c(“JM”,“JS”),class=“因子”),名称=结构(c(2L,1L),.标签 = c("Jess", "Jim"), class= "因子"), X = c(3, 5), Y = c(4, 6), Z = c(5, 7), A = c (6, 8), B = c(7, 9), C = c(8, 10), 测试 = 结构(c(0.8, 0.892857142857143, 0.8, 0.892857142857143), .Dim = c(2L, 2L), . Dimnames = list(NULL, c("1", "2")))), .Names = c("缩写", "名称", "X", "Y", "Z", "A", " B", "C", "Test"), row.names = 1:2, class= "data.frame")

标签: r apply records


【解决方案1】:

请注意,您向apply 提供了一个带有参数“row”的函数,但您从未在函数中使用它。我也不明白为什么您需要像我认为的那样使用 apply

df_new$Test <- (df_new[,8]/df_new[,6])/(df_new[,5]/df_new[,3])

应该给你你想要的

【讨论】:

    【解决方案2】:

    在这种情况下,您实际上不需要使用 apply。利用 R 是矢量化的事实,只需执行以下操作:

    df_new$Test <- (df_new$C / df_new$A) / (df_new$Z / df_new$X)
    # Abbreviation Name X Y Z A B  C      Test
    # 1           JM  Jim 3 4 5 6 7  8 0.8000000
    # 2           JS Jess 5 6 7 8 9 10 0.8928571
    

    R 将 sum 中的每一列视为一个向量,并按元素对它们进行操作。它使用所有向量中的第一个元素返回第一个值,然后使用所有向量中的第二个元素返回第二个值,然后任何向量中都没有更多元素,因此返回两个数字的向量。

    【讨论】:

    • 谢谢西蒙。这确实有助于我理解“$”的应用。在分配的左侧,数据框后的 $ 创建一个新列。在右侧,我可以使用 $ 来标识用于计算的感兴趣的列。知道很有帮助!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2019-06-17
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多