【问题标题】:R invalid subscript type doubleR无效的下标类型double
【发布时间】:2015-09-16 20:12:44
【问题描述】:

我有如下所示的示例数据

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))

我正在使用以下代码在指定的Id 处插入Vg 的值。

data_tidy %>% group_by(Die,Device) %>% 
    mutate(Vt=approx(x=log10(Id), y=Vg, xout=log10(3e-8*W/L))$y)

我收到一个错误提示

错误:无效的下标类型'double'

我很惊讶,因为几天前我能够编译这段代码而没有任何错误。我还在论坛here 上讨论过代码。我不确定是什么问题。任何帮助将不胜感激。

【问题讨论】:

  • 您的数据中某处的 Id 为零?
  • 我在上面的示例数据上运行代码,其中 Id 不是 0,但我仍然收到错误。
  • 您的代码和数据没有出现任何此类错误
  • 看了你的评论后我又试了一次。我犯了同样的错误。不知道这里发生了什么。
  • 不,我认为你不是。请参阅下面的答案。

标签: r


【解决方案1】:

我认为问题是如果我们破坏代码,您会尝试执行以下操作。

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

现在使用组合代码,我认为您正在尝试访问 x 而不是 y

> 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 类型的下标为列表下标,这导致了此问题。如果你想让Vtx 元素发生变异。使用

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 元素,而是 Vt 的 y 元素。从代码中也可以看出,当 Id=3e-8*W/L 时,我试图确定 Vt 的值。但是,如果我使用 [["y"]] 而不是 $y 来索引 y 值,它似乎可以工作。我不知道为什么 $y 似乎对你有用,但对我没用。
【解决方案2】:

这里有一个使用单个脚本的解决方案:

https://github.com/hadley/dplyr/issues/1554

dplyr::mutate(df, newColumn = someVariable$'a')

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 2012-01-06
    • 2018-09-11
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    相关资源
    最近更新 更多