我有一个数据集(在数据帧中)。我使用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将把和中的每一列作为一个向量,并按元素对它们进行操作。它使用所有向量中的第一个元素返回第一个值,然后使用所有向量中的第二个元素返回第二个值,然后在任何向量中都没有其他元素,因此返回一个包含两个数字的向量。