我正在尝试生成一个数据帧,该数据帧使用现有数据帧中的for循环(可能)来生成信息并替换或编写新的df
我有一个非常大的数据框,我想生成一个新的数据框,将所有行与数据框中的单个参考行进行比较。如果该单元格与参考行中的同一列单元格相匹配,则新数据帧将简单地说T(true),否则将返回F(false)。
给出了数据帧(df):
Name pos1 pos2 pos3 pos4
JU1 6 7 9 8
JU2 6 4 5 7
JU3 6 7 5 4
JU4 4 8 5 4
我想使用JU3作为参考行来生成具有相同列和行标题的新df,它将为与参考行匹配的每一行中的所有单元格返回true(T)和false(F)如果没有的话。
预期结果将是一个数据帧(df2):
Name pos1 pos2 pos3 pos4
JU1 T T F F
JU2 T F T F
JU3 T T T T
JU4 F F T T
我一直在使用if-else命令进行for循环,但是我通常对编码并不熟悉,所以我还没走得太远。我不能完全确定是否可以简单地覆盖现有数据帧,或者完全写入一个新的csv文件或表更有意义。我确定这是一个非常简单的问题,但是任何帮助或指导都将不胜感激!
答案 0 :(得分:0)
这是一个可能的解决方案:
ref1<-c(6,7,5,4)
cbind(Name=df$Name,as.data.frame(purrr::map2(df[,-1],ref1,function(x,y) x==y)))
Name pos1 pos2 pos3 pos4
1 JU1 TRUE TRUE FALSE FALSE
2 JU2 TRUE FALSE TRUE FALSE
3 JU3 TRUE TRUE TRUE TRUE
4 JU4 FALSE FALSE TRUE TRUE
“自动”
ref2<-as.vector(df[df$Name=="JU3",-1])
cbind(Name=df$Name,as.data.frame(purrr::map2(df[,-1],ref2,function(x,y) x==y)))
答案 1 :(得分:0)
在base R
中,我们基于“名称”以条件提取行,复制行以使维与原始数据相同,然后进行比较(==
)
cbind(df[1], df[-1] == df[df$Name == "JU3", -1][rep(1, nrow(df)), ])
# Name pos1 pos2 pos3 pos4
#1 JU1 TRUE TRUE FALSE FALSE
#2 JU2 TRUE FALSE TRUE FALSE
#3 JU3 TRUE TRUE TRUE TRUE
#4 JU4 FALSE FALSE TRUE TRUE
df <- structure(list(Name = c("JU1", "JU2", "JU3", "JU4"), pos1 = c(6L,
6L, 6L, 4L), pos2 = c(7L, 4L, 7L, 8L), pos3 = c(9L, 5L, 5L, 5L
), pos4 = c(8L, 7L, 4L, 4L)), class = "data.frame", row.names = c(NA,
-4L))