【问题标题】:Parametric subsetting and assignment参数子集和赋值
【发布时间】:2014-02-14 12:14:38
【问题描述】:

在我的问题中,我需要根据给定的函数参数将一些值分配给可能超出其界限的 data.frame。

要实现参数分配,可以定义:

ass=function(x,i,j,a){
  # some operations on x,i,j,a 
  `[<-`(x,i,j,a) 
}

ass=function(x,i,j,a){
  # some operations on x,i,j 
  do.call(`[<-`, list(x,i,j,a))
}

当我需要模拟x[,j]x[i,] 时,问题就来了。在某些情况下TRUE 会起作用,即:

`[<-`(x,T,j,a); `[<-`(x,i,T,a)  

就像:

x[,j]=a; x[i,]=a; 

现在假设xn*3 data.frame,我可以毫无问题地分配越界,例如:

`[<-`(x,T,4,0) 

仍然像

x[,4]=0

但是:

`[<-`(x,T,4:5,0) 

给出“下标越界”错误,而

 x[,4:5]=0

有效。

我如何“破解”符号"[&lt;-"(x,i,j,a)do.call("[&lt;-", list(x,i,j,a)) 以获取所有i(或所有j)?

【问题讨论】:

  • 我很好奇。 参数子集是什么意思?
  • EDIT 要选择所有行或列,只需将参数留空,即`[&lt;-`(x,,4:5,0)。我猜想通过为尚不存在的行或列提供ij 参数,您正在尝试对不存在的列或行索引进行子集化。 T 值实际上被回收以匹配data.frameij 的长度,这就是它适用于确实存在的索引的原因。例如尝试`[&lt;-`(x,c(T,F),1,0) 将第一列的每隔一行设置为零。
  • @SimonO'Hanlon:问题是我应该将什么值传递为i,以便它从x,i,j,a 中消失?使用 TRUE 技巧,我可以使用 ass(x,TRUE,j,a) 或说 ass(x,1,j,a)。目前我使用if 重写x,i,j,a,如x,,j,ax,i,,a
  • @SimonO'Hanlon:另外,如果缺少 i(或 j),我该如何使用 do.call 方法? do.call([, list(x,,j,a)) 不起作用。

标签: r variable-assignment assignment-operator


【解决方案1】:

正式重述问题

给定整数i,j 和矩阵/data.frame x,找到m 这样:

x[i,m]; x[m,j]; x[m,m]

分别是相同的。到:

x[i,]; x[,j]; x[,]

这当然也适用于替换,即:

x[*] = value

并使用语法`[``[&lt;-` 或相关的do.call

问题调查

如果您不想了解幕后情况,可以直接查看建议的解决方案。

由于`[``[&lt;-` 是函数,m 应被视为参数i, j 的缺失值。因此,应该创建一个“人为”缺失值。
检查函数中的实际缺失值会发生什么?

f=function(i,j){
   cat ('A) ');  print(match.call())
   cat ('B) ');  print(sys.call())
   cat ('C)\n'); print(as.list(sys.call()))
}

当使用没有前面参数的逗号时,我们得到:

f(,2)

#A) f(j = 2)
#B) f(, 2)
#C)
#[[1]]
#f
# 
#[[2]]
# 
# 
#[[3]]
#[1] 2

sys.call 列表的第二个元素似乎是空的!所以我们尝试捕捉这个值:

f=function(a,b) as.list(sys.call())[[2]] 
m=f(,)

和:

m                   
Error: argument "m" is missing, with no default

...从来没有一个错误如此受欢迎。

建议的解决方案

设置:

m=(function(a,b) as.list(sys.call())[[2]])(,)

m 现在是一个人工缺失值。子集化时,它的操作类似于逗号附近的空白区域。事实上:

x=matrix(1:12, ncol=3)    

x[m,m]
#     [,1] [,2] [,3]
#[1,]    1    5    9
#[2,]    2    6   10
#[3,]    3    7   11
#[4,]    4    8   12

x[1, m ]
#[1] 1 5 9

x[m, 1 ]
#[1] 1 2 3 4

到目前为止,虽然更正式,但这种方法提供的不仅仅是回收技巧x[T,T]x[1,T]x[T,1]。但是,当解决方法不起作用时:

x=data.frame(x)
x[T,4:5]=0
#Error in `*tmp*`[[j]] : subscript out of bounds

人工缺失值有效:

x[m,4:5]=0
x
#  X1 X2 X3 V4 V5
#1  1  5  9  0  0
#2  2  6 10  0  0
#3  3  7 11  0  0
#4  4  8 12  0  0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2012-08-18
    • 2010-12-10
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多