R无效的下标类型double

4
我有如下所示的样本数据。
Die     Device      Id      Vg     W   L 
  1     Device1       1       0    10   1 
  1     Device1     1.2     0.1    10   1 
  1     Device1     1.3     0.2    10   1
  1     Device2       1       0    10   2
  1     Device2     1.2     0.1    10   2 
  1     Device2     1.3     0.2    10   2
  1     Device3       1       0    10   3
  1     Device3     1.2     0.1    10   3 
  1     Device3     1.3     0.2    10   3
data_tidy <- structure(list(Die = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Device = c("Device1", 
"Device1", "Device1", "Device2", "Device2", "Device2", "Device3", 
"Device3", "Device3"), Id = c(1, 1.2, 1.3, 1, 1.2, 1.3, 1, 1.2, 
1.3), Vg = c(0, 0.1, 0.2, 0, 0.1, 0.2, 0, 0.1, 0.2), W = c(10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L), L = c(1L, 1L, 1L, 2L, 
2L, 2L, 3L, 3L, 3L)), .Names = c("Die", "Device", "Id", "Vg", 
"W", "L"), class = "data.frame", row.names = c(NA, -9L))

我使用以下代码来插值指定IdVg的值。
data_tidy %>% group_by(Die,Device) %>% 
    mutate(Vt=approx(x=log10(Id), y=Vg, xout=log10(3e-8*W/L))$y)

我收到一个错误提示:

错误:无效下标类型“double”

我很惊讶,因为几天前我能够编译这段代码而没有任何错误。我还在论坛上讨论了这段代码(链接)。我不确定问题出在哪里。任何帮助将不胜感激。


你的数据中有地方的ID是零吗? - Soheil
我正在运行上面的示例数据代码,其中Id不为0,但仍然出现错误。 - beeprogrammer
我使用你的代码和数据没有发现任何错误。 - Dhawal Kapil
我刚刚看了你的评论后又试了一遍,但还是出现了同样的错误。不知道这里出了什么问题。 - beeprogrammer
我发现如果我将data_tidy<-setDT(data_tidy)赋值,它可以工作。但是我不确定为什么我无法将其作为数据框工作。 - beeprogrammer
显示剩余2条评论
2个回答

3

3
我认为问题在于你试图执行以下操作(如果我们分解代码)。 Vt是什么。
Vt=approx(x=log10(data_tidy$Id),y=data_tidy$Vg,
xout=log10(3e-8*(data_tidy$W)/(data_tidy$L)))

这将给出Vt,其值为:
> Vt
$x
[1] -6.522879 -6.522879 -6.522879 -6.823909 -6.823909 -6.823909 -7.000000 -7.000000
[9] -7.000000

$y
[1] NA NA NA NA NA NA NA NA NA

现在,通过合并代码,我认为您正在尝试访问y而不是x
> data_tidy%>%
+     group_by(Die,Device)%>% #Die is numeric, Device is factor
+     mutate(Vt=(approx(x=log10(Id),y=Vg,xout=log10(3e-8*W/L)))$x)
Error: invalid subscript type 'double'

你正在试图在mutate中使用类型为double的下标对列表进行下标订阅,这正是导致问题的原因。如果你想要改变Vt中的x元素,请使用Vt的mutate方法。
data_tidy%>%
    group_by(Die,Device)%>% #Die is numeric, Device is factor
    mutate(Vt=(approx(x=log10(Id),y=Vg,xout=log10(3e-8*W/L)))[["x"]])

这应该可以工作。


我不想要Vt的x元素,而是y元素。从代码中也可以看出,当Id=3e-8*W/L时,我正在尝试确定Vt的值。但是,如果我使用[["y"]]来索引y值,它似乎能够工作。我不确定为什么$y对您有效,但对我无效。 - beeprogrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接