R ddply:如何将列名作为参数传递?

R ddply:如何将列名作为参数传递?,r,plyr,R,Plyr,我有一个数据框,其中列名是根据参数生成的,所以我不知道它们的确切值。我想把这些字段也作为参数传递给ddply。 我想答案是显而易见的,但是有人能帮我把灯打开吗 下面的例子使用了iris数据集,它给出了我想要做什么的想法,以及我的工作的意外结果。第一个示例的结果iris1是我想要实现的,但是通过将列名作为参数传入,就像在我的iris2工作中一样,这并没有给我预期的结果 iris1 <- ddply(iris, .(Species), transform, pw_first = Petal.W

我有一个数据框,其中列名是根据参数生成的,所以我不知道它们的确切值。我想把这些字段也作为参数传递给ddply。 我想答案是显而易见的,但是有人能帮我把灯打开吗

下面的例子使用了iris数据集,它给出了我想要做什么的想法,以及我的工作的意外结果。第一个示例的结果iris1是我想要实现的,但是通过将列名作为参数传入,就像在我的iris2工作中一样,这并没有给我预期的结果

iris1 <- ddply(iris, .(Species), transform, pw_first = Petal.Width[1], 
              pw_last = Petal.Width[length(Petal.Width)])
myCol <- 'Petal.Width'
iris2 <- ddply(iris, .(Species), transform, pw_first = myCol[1], 
               pw_last = myCol[length(myCol)])

head(iris1)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species pw_first pw_last
# 1          5.1         3.5          1.4         0.2  setosa      0.2     0.2
# 2          4.9         3.0          1.4         0.2  setosa      0.2     0.2
# 3          4.7         3.2          1.3         0.2  setosa      0.2     0.2
# 4          4.6         3.1          1.5         0.2  setosa      0.2     0.2
# 5          5.0         3.6          1.4         0.2  setosa      0.2     0.2
# 6          5.4         3.9          1.7         0.4  setosa      0.2     0.2

head(iris2)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species    pw_first     pw_last
# 1          5.1         3.5          1.4         0.2  setosa Petal.Width Petal.Width
# 2          4.9         3.0          1.4         0.2  setosa Petal.Width Petal.Width
# 3          4.7         3.2          1.3         0.2  setosa Petal.Width Petal.Width
# 4          4.6         3.1          1.5         0.2  setosa Petal.Width Petal.Width
# 5          5.0         3.6          1.4         0.2  setosa Petal.Width Petal.Width
# 6          5.4         3.9          1.7         0.4  setosa Petal.Width Petal.Width

iris1
colName
colName仍在学习R,但我发现ddply的功能接口适合我的大脑。。。也许这很接近

iris1 <- ddply(iris, 
               .(Species), 
               function(x,y) {result = data.frame(x$Petal.Width[1],
                                                  x$Petal.Width[length(x$Petal.Width)])
                              names(result) <- y
                              return(result)},
               c('first','last'))
iris1
或者这个

iris1 <- ddply(iris, 
               .(Species), 
               function(x,y) {
                 result = cbind(x,x$Petal.Width[1],x$Petal.Width[length(x$Petal.Width)])
                 names(result) = c(names(x),y)
                 return(result)
                 },
               c('first','last'))
head(iris1)
好的,现在更有意义了。将data.frame的现有列作为参数传递,然后使用参数列作为计算源向data.frame生成两个添加的列。这个怎么样:

iris1 <- ddply(iris, 
               .(Species), 
               function(x,y) {
                 len <- length(x[,1])
                 first <- x[1,y]
                 last <- x[len,y]
                 result <- cbind(x,first,last)
                 names(result) <- c(names(x),'first','last')
                 return(result)
               },
               'Petal.Width'
)
head(iris1)

我希望您要做的不是“第一个”和“最后一个”——比如
mean
sd
函数。第一个和最后一个依赖于以已知顺序提供匿名函数数据的
ddply
函数。。。我不确定是不是。您可能会得到不同的、出乎意料的答案。

仍在学习R,但我发现ddply的功能界面适合我的大脑。。。也许这很接近

iris1 <- ddply(iris, 
               .(Species), 
               function(x,y) {result = data.frame(x$Petal.Width[1],
                                                  x$Petal.Width[length(x$Petal.Width)])
                              names(result) <- y
                              return(result)},
               c('first','last'))
iris1
或者这个

iris1 <- ddply(iris, 
               .(Species), 
               function(x,y) {
                 result = cbind(x,x$Petal.Width[1],x$Petal.Width[length(x$Petal.Width)])
                 names(result) = c(names(x),y)
                 return(result)
                 },
               c('first','last'))
head(iris1)
好的,现在更有意义了。将data.frame的现有列作为参数传递,然后使用参数列作为计算源向data.frame生成两个添加的列。这个怎么样:

iris1 <- ddply(iris, 
               .(Species), 
               function(x,y) {
                 len <- length(x[,1])
                 first <- x[1,y]
                 last <- x[len,y]
                 result <- cbind(x,first,last)
                 names(result) <- c(names(x),'first','last')
                 return(result)
               },
               'Petal.Width'
)
head(iris1)

我希望您要做的不是“第一个”和“最后一个”——比如
mean
sd
函数。第一个和最后一个依赖于以已知顺序提供匿名函数数据的
ddply
函数。。。我不确定是不是。你可能会得到不同的、意想不到的答案。

给你。此解决方案的思想是使用
get
,它在当前环境中查找变量。因此,
get(mycl)
将在所操作的数据帧中找到
mycl

myCol <- 'Petal.Width'
iris2 <- ddply(iris, .(Species), transform, 
  pw_first = get(myCol)[1],
  pw_last = get(myCol)[length(get(myCol))]
)

myCol给你。此解决方案的思想是使用
get
,它在当前环境中查找变量。因此,
get(mycl)
将在所操作的数据帧中找到
mycl

myCol <- 'Petal.Width'
iris2 <- ddply(iris, .(Species), transform, 
  pw_first = get(myCol)[1],
  pw_last = get(myCol)[length(get(myCol))]
)


不,不是这样的。你最后的1.8分不正确。这是数据集中的最后一条记录,而不是组中的最后一条记录。我的示例中的0.2和0.2实际上是正确的。我所挣扎的是我的iris2例子。如何将列名作为参数传递?谢谢-但您的答案没有告诉我如何将列名作为参数传递。编辑了我的答案。对不起,我忘了那部分。不,不是那部分。你最后的1.8分不正确。这是数据集中的最后一条记录,而不是组中的最后一条记录。我的示例中的0.2和0.2实际上是正确的。我所挣扎的是我的iris2例子。如何将列名作为参数传递?谢谢-但您的答案没有告诉我如何将列名作为参数传递。编辑了我的答案。对不起,我忘了那部分。你能举一个“预期结果”的例子吗?“字段名”是否与“列名”即变量名相同?预期结果在head(iris1)中,即在两列中均为0.2。我希望这些值在head(iris2)中,但需要将列名作为参数传递。是fieldnames=columnnames。您能举一个“预期结果”的例子吗?“字段名”是否与“列名”即变量名相同?预期结果在head(iris1)中,即在两列中均为0.2。我希望这些值在head(iris2)中,但需要将列名作为参数传递。Yes fieldnames=columnnames。可能越来越近了-但我想将列名'Petal.Width'作为参数传入。最后一个参数是ddply
c('first','last'))
命名函数附加的列。我想传递的不是新列名,而是现有列名,即'Petal.Width'可能越来越近,但我想传递列名'Petal.Width'作为参数。ddply的最后一个参数
c('first','last'))
为函数附加的列命名。我想作为参数传递的不是新列名-而是现有列名-即'Petal.Width',在这种情况下,您最好不要使用
transform
@hadley,所以您的意思是直接将列添加到
df
并在函数内部返回它?或者您建议使用
mutate
?是的,直接修改数据帧。在这种情况下,您最好不要使用
transform
@hadley,因此您的意思是直接将列添加到
df
并在函数内部返回它?或者您建议使用
mutate
?是的,直接修改数据帧即可。
iris2 <- ddply(iris, .(Species), function(df){
  x = df[[myCol]]
  transform(df, pw_first = x[1], pw_last = x[length(x)])
})