R 编程 - 防止"apply"在数据范围内重复结果



我有一个数据集(在数据帧中)。我使用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]))

返回的数据(from 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、文件="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时)。

请注意,您为apply提供了一个函数,该函数接受参数"row",但您从未在该函数中使用该参数。我也不明白为什么你需要使用apply,因为我认为

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

应该给你你想要的

在这种情况下,您实际上不需要使用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将把和中的每一列作为一个向量,并按元素对它们进行操作。它使用所有向量中的第一个元素返回第一个值,然后使用所有向量中的第二个元素返回第二个值,然后在任何向量中都没有其他元素,因此返回一个包含两个数字的向量。

最新更新