【问题标题】:apply function with a conditional statement using two dataframe使用两个数据框的条件语句应用函数
【发布时间】:2017-01-05 23:20:50
【问题描述】:

我有两个数据框 x 和 y。

x<-data.frame("j"=c("A","B","C"),"k"=c(1,90,14))
  x j  k
  1 A  1
  2 B 90
  3 C 14

y<-data.frame("A"=c(1,0,0,1,1),"B"=c(0,1,0,0,1),"C"=c(1,1,1,0,0))
  A B C
1 1 0 1
2 0 1 1
3 0 0 1
4 1 0 0
5 1 1 0

我需要一个带有条件语句的函数,如果在数据集 y 中有一个 0 a 替换为 -1 或 1 替换为 A 列中的 1 等等以获得这个结果。

z<-data.frame("A"=c(1,-1,-1,1,1),"B"=c(-90,90,-90,-90,90),"C"=c(14,14,14,-14,-14))
   A   B   C
1  1 -90  14
2 -1  90  14
3 -1 -90  14
4  1 -90 -14
5  1  90 -14

【问题讨论】:

  • 如果把0换成-1,基本上就是乘法:(-(y == 0) + y) * matrix(x$k, nrow(y), ncol(y), byrow = TRUE)
  • 如果在 x 和 y 之间匹配 pf 列和行的顺序:y[y==0] &lt;- -1 ; y* x$k[col(y)]

标签: r function if-statement dataframe


【解决方案1】:

这是一个有趣的基础 R 中的单行代码,它使用了许多众所周知的函数。

setNames(do.call(data.frame, Map(function(x, y) x * c(-1, 1)[y+1], x$k, y)), LETTERS[1:3])
   A   B   C
1  1 -90  14
2 -1  90  14
3 -1 -90  14
4  1 -90 -14
5  1  90 -14

最里面的函数x * c(-1, 1)[y+1] 获取 x 的值(它是一个标量——1、90 或 14)并根据 y 的值将其乘以负数 -1 或 1。

Map 将 x$k 的值作为 x 并将 data.frame y 的变量作为 y 参数,对每一对执行函数并返回一个列表。三个向量。

此列表被转换为带有do.call 的data.frame,变量的名称由setNames 提供。

【讨论】:

  • 有没有办法使用 apply 或 lapply 和 ifelse 获得这些结果?
  • 注意到Mapmapply 的包装器可能会很有趣。 ifelse 往往很慢,c(-1, 1)[y+1] 实际上是在执行ifelse 的角色,但更快。 ifelse 版本将是 ifelse(y==1, y, -1)
猜你喜欢
  • 2019-06-29
  • 1970-01-01
  • 2019-10-15
  • 2017-09-08
  • 2021-10-12
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2014-02-08
相关资源
最近更新 更多