【发布时间】: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")