2013-04-11 33 views
0

我有一个数据集(在数据框中)。我正在使用apply向数据集添加一个新列,其中新列的行使用该行内其他列的元素执行函数。应用工程,但在将函数应用于每一行之后,它会继续超出范围,并且会一直重复应用这些值。R编程 - 防止重复结果中的“应用”与数据范围不同

这里是我开始的数据:

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,文件= “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时)。

+0

你能张贴'dput(df_new)的结果',使这个重现? – 2013-04-11 14:41:06

+0

@DavidRobinson数据发布在问题中?只需使用'read.table(text =“copy/paste here,h = T)' – 2013-04-11 14:46:00

+0

@DavidRobinson,尽管Dason的解决方案对我有用,但这是我从dput获得的。 (缩写=结构(1:2,.Label = c(“JM”, “JS”),class =“factor”),Name = structure(c(2L, 1L),.Label = c(“Jess”, “Jim”),class =“factor”),X = c(3,5),Y = c(4,6),Z = c(5, 7),A = c(6,8),B = c(7,9),C = c(8,10),Test =结构(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”) – 2013-04-11 14:50:46

回答

3

请注意,您提供了一个函数apply,它需要一个参数“row”,但您从不在函数中使用该函数。我还没有看到你为什么会需要使用申请,因为我认为

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

应该给你你想要的东西

+0

这太棒了,谢谢! – 2013-04-11 14:49:46

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将在总和为载体对待每一列和元素方面对它们进行操作。它使用所有向量中的第一个元素返回第一个值,然后使用所有向量中的第二个元素返回第二个值,然后在任何向量中没有更多元素,因此返回两个数字的向量。

+0

谢谢Simon。这真的帮助我理解“$”的应用。在分配的左侧,$在数据框之后创建一个新列。在右边,我可以使用$来确定用于计算的感兴趣列。知道非常有帮助! 谢谢。 – 2013-04-11 14:53:55