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