apply()无法正常工作

时间:2018-08-14 08:34:36

标签: r apply

我试图掌握apply函数的工作方式。这是我尝试过的:

int

问题(通过评论表示):

  • 第3行为什么行2不能工作?
  • 为什么我可以使用[2,]来引用第2行(第6行),却不能使用[,2]来引用第2列(行4),而必须使用[2](第5行) ?
  • 在第6行中,我期望从第7行中得到:行2(具有双精度值)。为什么我没有从第6行得到这个,我用 MARGIN = 2?

4 个答案:

答案 0 :(得分:3)

apply需要用于正长度尺寸的东西。为简单起见,某些具有行和列的对象。

这就是为什么您拥有margin 1, 2。代表按行和按行操作。

像这样检查您的输入值:

dim(df["x2"])
dim(df[,2]) #this is null, so it does not work

df[,2]为您提供与df$x2相同的向量。向量没有行和列。因此不能与apply一起使用。

为了了解您在做什么错:

在控制台中输入?"["并阅读所有内容。还可以玩...你已经在做什么!

仔细研究drop参数。

最后df[2,]将子集设置为一行。它仍然是一个数据框。 选中dim(df[2,])

apply(df[2,], 1, function(x) x*2) #works, but gives me vertical vector
apply(df[2,], 2, function(x) x*2) #works; this gives me the output I expected in line above

您没有获得相同输出的原因。是apply存在的全部原因。请阅读?apply来了解。

在阅读了上述两个资源后,如果您有任何疑问,请随时提问。

这是一个小例子:

m <- matrix(1:9,nrow=3)
m
apply(m,1,max) #row-wise max value
apply(m,2,max) #col-wise max value

答案 1 :(得分:1)

第3行为什么第2行不起作用?

df$x2是向量,即c(1,2,3,4,5),而df["x2"]是只有一列的数据帧。向量没有第二个维度可以应用。有关子集如何工作的详细信息,请参见R中的?'['],这实际上与apply函数无关。

为什么我可以使用[2,]来引用第2行(第6行),却不能使用[,2]来引用第2列(行4),而必须使用[2](第2行) 5)代替? 同样,请参阅子设置帮助页面,但是df[,2,drop=FALSE]可能正是您所需要的。

在第6行中,我期望从第7行中得到:第2行(具有双精度值)。为什么我没有从第6行得到这个,我用MARGIN = 2指示行? ?apply value 部分说明了您可以预期的来自应用调用的输出的尺寸:

  

如果每次对FUN的调用都返回一个长度为n的向量,那么如果n> 1,apply将返回一个尺寸为c(n,dim(X)[MARGIN])的数组。如果n等于1,则如果MARGIN则apply将返回一个向量长度为1,尺寸为dim(X)[MARGIN]的数组。

在这种情况下,我们看到:

> dim(df[2,]) # [1] 1 2

等等:

apply(df[2,], 1, function(x) x*2)

具有n=2dim(df[2,])[1]=1,因此您应该期望输出的尺寸为c(2,1)

答案 2 :(得分:1)

问题在解决:

第一: if [C Date] = null then Date.From(DateTime.LocalNow()) - Date.From(DateTime.LocalNow()) else [C Date] - Date.From(DateTime.LocalNow()) 和df [,2]与df$x2和df [2]不同,因为前者返回df["x2"]向量,后者返回numeric

第二: data.frame返回df[2, ]的第二行。如果您使用data.frame,则要遍历各行,每一行都表示为一个(命名的)向量,其长度等于MARGIN = 1中的列数。 如果您使用data.frame,则会再次浏览各列,每列都表示为一个(命名的)向量,其长度等于MARGIN = 2中的行数。

答案 3 :(得分:0)

您应该查看表达式的每种类型和维度

> typeof(df$x2)
[1] "double"
> dim(df$x2)
NULL

> typeof(df["x2"])
[1] "list"
> dim(df["x2"])
[1] 5 1

> typeof(df[, 2])
[1] "double"
> dim(df[, 2])
NULL

> typeof(df[2])
[1] "list
> dim(df[2])
[1] 5 1

> typeof(df[2, ])
[1] "list"
> dim(df[2,])
[1] 1 2

第2行不起作用,因为您尝试将函数应用于具有NULL维的变量。 (dim(X) must have positive length)。其余类似。您必须注意应用中表达式的类型。我建议您仅打印值以检查apply功能是否正确。