【问题标题】:Generate vector from comparison通过比较生成向量
【发布时间】:2012-08-09 11:01:00
【问题描述】:

我喜欢通过将向量与列表元素进行比较来生成包含 0 和 1 的向量。一世 有以下向量:

functions=c("abline", "as.numeric", "attach", "data.frame", "ddply", "mean")

这个“函数”向量现在应该与一个包含这个向量子集的向量列表合并。该列表如下所示:

[[1]]
[1] "data.frame"

[[2]]
[1] "data.frame" "ddply"      "mean"      

[[3]]
[1] "data.frame" "abline"      "attach"      "mean"
... 

因此,我想按照“函数”向量的顺序和长度生成一个向量,其中包含与“函数”向量匹配的每个元素的 1 和不可用的 0。我想放入数据框中的所有这些。对于这三个列表元素,结果如下所示:

    "abline" "as.numeric" "attach" "data.frame"  "ddply"  "mean"
1      0          0          0           1          0       0
2      0          0          0           1          1       1
3      1          0          1           1          0       1

有人知道我如何实现这一目标吗?

最佳搜索结果。

【问题讨论】:

  • 第一步是lapply(listofvectors, function(z)vectoroffunctions %in% z + 0)
  • @danas.zuokas 从技术上讲你是对的。尽管如此,使用as.numeric() 是一种比添加+ 0 更清楚地表明您将逻辑转换为数字的方法。我更喜欢可读性而不是黑客攻击,除非你真的需要节省那微秒。

标签: r


【解决方案1】:

创建数据

functions=c("abline", "as.numeric", "attach", "data.frame", "ddply", "mean")

mylist <- list(
  c("data.frame"),
  c("data.frame","ddply","mean"),
  c("data.frame","abline","attach","mean")
)

那么你可以这样做:

> solution <- lapply(mylist,function(i) as.numeric(functions %in% i))

> mydf <- as.data.frame(do.call(rbind,solution))

> names(mydf) <- functions

> mydf
  abline as.numeric attach data.frame ddply mean
1      0          0      0          1     0    0
2      0          0      0          1     1    1
3      1          0      1          1     0    1

【讨论】:

  • 非常感谢。太好了!
  • 我注意到了一件事。 mydf 仍然是一个列表!我无法以某种方式将其转换为数据框。 typeof(as.dataframe(mydf)) 或 typeof(data.frame(mydf)) 仍然给我返回“列表”,我无法分配行名。有什么想法吗?最佳 Sab.
【解决方案2】:

您可以使用嵌套的sapply

list <- list("data.frame",c("data.frame","ddply","mean"),c("data.frame","abline","attach","mean"))

sapply(functions,function(x) sapply(list,function(y) as.numeric(x%in%y)))
     abline as.numeric attach data.frame ddply mean
[1,]      0          0      0          1     0    0
[2,]      0          0      0          1     1    1
[3,]      1          0      1          1     0    1

或者只是一个,如果你使用factortable

do.call("rbind",lapply(list,function(x) table(factor(x,levels=functions))))
     abline as.numeric attach data.frame ddply mean
[1,]      0          0      0          1     0    0
[2,]      0          0      0          1     1    1
[3,]      1          0      1          1     0    1

【讨论】:

  • 感谢您的回答!我也尝试了您的解决方案,但我遇到了与上述解决方案相同的问题。我最终得到了一个似乎无法转换为 data.frame 的列表元素。
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 2012-10-04
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2020-03-25
相关资源
最近更新 更多