我试图掌握apply函数的工作方式。这是我尝试过的:
int
问题(通过评论表示):
答案 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=2
和dim(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功能是否正确。