从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
中按顺序排列来自dataframeB
行r
的元素。
在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)}))