从Excel过渡到R:如何在R中实现if语句和索引逻辑?

时间:2016-07-28 02:17:20

标签: r excel

正如标题所描述的那样,我正在从Excel转换到R,但我发现实现非常棘手的数据操作在Excel中更直观,而不是R.

我有两个数据框:

A <- read.table(text="Var1  Var2    Var3    Var4
                      1 0   2   0
                      3 4   0   0
                      0 6   0   7", header=T)
B <- read.table(text="VarA  VarB
                      2.24  1.82
                      3.07  2.97
                      6.5   7.46", header=T)

我想从A和B创建第3个数据框,如下所示:

Result <- read.table(text="Result1  Result2 Result3 Result4
                           2.24     NA      1.82    NA
                           3.07     2.97    NA      NA
                           NA       6.5     NA      7.46", header=T)

因此,如果数据框r的行c和列A中的元素&lt;&gt; 0,然后在数据框r的行c和列Results中按顺序放置数据框r的行B中的元素。

在Excel中,我会使用如下公式: enter image description here

2 个答案:

答案 0 :(得分:5)

由于matrix个对象是按列填充的,而不是行,因此您必须执行一些t ransposition以确保它们以正确的顺序填充:

replace(replace(A,TRUE,NA), which(t(A)!=0,arr.ind=TRUE)[,2:1], t(B) )

#     Var1 Var2 Var3 Var4
#[1,] 2.24   NA 1.82   NA
#[2,] 3.07 2.97   NA   NA
#[3,]   NA 6.50   NA 7.46

答案 1 :(得分:2)

我们可以尝试

r1 <- (NA^!A)*unlist(lapply(B, rep, ncol(A)/ncol(B)))
colnames(r1) <- paste0("Result", 1:ncol(r1))
r1
#     Result1 Result2 Result3 Result4
#[1,]    2.24      NA    1.82      NA
#[2,]    3.07    3.07      NA      NA
#[3,]      NA    6.50      NA    7.46

基于评论

 t(sapply(seq_len(nrow(A)), function(i) {
           x1 <- NA^(!A[i,])
           x1[!is.na(x1)] <- B[i,]
          unlist(x1)}))
 #     [,1] [,2] [,3] [,4]
 #[1,] 2.24   NA 1.82   NA
 #[2,] 3.07 2.97   NA   NA
 #[3,]   NA 6.50   NA 7.46

或@shayaa修改后的代码

t(sapply(seq_len(nrow(A)), function(i) {
            x1 <- ((A>0)^NA)[i,]
            x1[!is.na(x1)] <- B[i,]
            unlist(x1)}))