正如标题所描述的那样,我正在从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
中的元素。
答案 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)}))