【问题标题】:Using loop to make column selections using different vectors使用循环使用不同的向量进行列选择
【发布时间】:2014-05-24 09:24:35
【问题描述】:

假设我有 3 个向量(10 个字符串):

X <- c(1,1,0,1,0, 1,1, 0, NA,NA)
H <- c(0,0,1,0,NA,1,NA,1, 1, 1 )
I <- c(0,0,0,0,0, 1,NA,NA,NA,1 )

Data.frame Y 包含 10 列和 6 行:

1 2 3 4 5 6 7 8 9 10  
0 1 0 0 1 1 1 0 1  0      
1 1 1 0 1 0 1 0 0  0      
0 0 0 0 1 0 0 1 0  1      
1 0 1 1 0 1 1 1 0  0      
0 0 0 0 0 0 1 0 0  0      
1 1 0 1 0 0 0 0 1  1

我想使用向量 X, H en I 在 data.frame Y 中进行列选择,使用向量中的“1”和“0”作为选择标准。 因此,使用“1”作为选择标准的向量 X 的结果应该是:

X <- c(1,1,0,1,0, 1,1, 0, NA,NA)
1 2   4    6 7
0 1   0    1 1
1 1   0    0 1
0 0   0    0 0
1 0   1    1 1
0 0   0    0 1
1 1   1    0 0

对于使用“1”作为选择标准的向量 H:

H <- c(0,0,1,0,NA,1,NA,1, 1, 1 )
3      6    8  9  10
0      1    0  1  0
1      0    0  0  0
0      0    1  0  1
1      1    1  0  0
0      0    0  0  0
0      0    0  1  1

对于向量 I,使用“1”作为选择标准:

I <- c(0,0,0,0,0, 1,NA,NA,NA,1 )
6          10
1          0
0          0
0          1
1          0
0          0
0          1

为了方便和速度,我想使用循环。可能是这样的:

all.ones <- lapply[,function(x) x %in% 1]

在结果 (all.ones) 中,每个向量的结果应保持独立。例如:

X 1,2,4,6,7    
H 3,6,8,9,10
I 6,10

【问题讨论】:

    标签: r loops vector dataframe identity-column


    【解决方案1】:

    这个怎么样?

    idx <- which(X==1)
    Y[,idx]
    

    编辑:对于六个向量,做

    idx <- which(X==1 & H==1 & I==1 & D==1 & E==1 & K==1)
    Y[,idx]
    

    如果您希望 Y 的所有列中至少有一个列表具有 1,请将 &amp; 替换为 |

    【讨论】:

    • 太棒了!非常感谢!
    • 这很完美!我现在正在尝试使用循环对数据帧 Y 上的六个不同向量执行此操作。 mylist
    • 在某种程度上这会导致 0 列有 300.000 行,所以信息似乎在计算中丢失了?
    【解决方案2】:

    问题是 NA,使用 which 绕过它。考虑以下几点:

    x <- c(1,0,1,NA)
    x[x==1]
    [1]  1  1 NA
    x[which(x==1)]
    [1] 1 1
    

    【讨论】:

      【解决方案3】:

      执行此操作的标准方法是使用 %in% 运算符:

      Y[, X %in% 1]
      

      要对多个向量执行此操作(假设您需要 AND 操作):

      mylist = list(X, H, I, D, E, K)
      Y[, Reduce(`&`, lapply(mylist, function(x) x %in% 1))]
      

      【讨论】:

      • 第一个很棒!第二个结果是 0 列和 300.000 行。
      • @EJHendriks 如果你能想出一个(简单的)可重现的例子,将相当容易查明问题
      • 我试图在上面更详细地描述这个问题。
      • @EJHendriks 看起来您只是想要一个“或”而不是“和”,所以只需将 & 替换为 |你应该很高兴
      • 不幸的是,这只会产生一个编译数据的结果字符串。目标是获得三组独立的列,即 X 1,2,4,6,7 H 3,6,8,9,10 I 6,10
      猜你喜欢
      • 2015-03-07
      • 1970-01-01
      • 2019-01-09
      • 2022-01-22
      • 2021-03-30
      • 2015-08-13
      • 1970-01-01
      • 2019-03-13
      相关资源
      最近更新 更多