如何使用数据帧运行for循环并输出新数据帧

时间:2019-02-10 03:36:01

标签: r dataframe

我正在尝试生成一个数据帧,该数据帧使用现有数据帧中的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文件或表更有意义。我确定这是一个非常简单的问题,但是任何帮助或指导都将不胜感激!

2 个答案:

答案 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))