从Excel转换到R:如何实现R中的语句和索引逻辑?

正如标题所描述的,我正在从Excel转换到R,但是我发现,实现真正棘手的数据操作在Excel中比在R中更直观。

我有两个dataframe:

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创build第三个dataframe,如下所示:

 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) 

因此,如果dataframeA ≠0的行r和列c的元素,则在dataframe的行r和列c中按顺序排列来自dataframeBr的元素。

在Excel中,我会使用一个公式,例如: 在这里输入图像说明

由于matrix对象是由列填充的,而不是行,所以你必须做一些转换以确保它们按照正确的顺序填充:

 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 

我们可以尝试

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