0

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

返回的数据(来自视图(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 时)。

4

2 回答 2

3

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

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

应该给你你想要的

于 2013-04-11T14:44:41.407 回答
1

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

于 2013-04-11T14:44:35.247 回答