【问题标题】:How to run a for loop using a data frame and output a new data frame如何使用数据框运行 for 循环并输出新的数据框
【发布时间】:2019-02-10 03:36:00
【问题描述】:

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

【问题讨论】:

  • 参考值是多少?它是动态的还是始终相同?
  • 这是一个开始:z == z[rep(3, nrow(z)),]
  • @NelsonGon 为迟到的回复道歉,它总是一样的。我会尝试这些建议!

标签: r dataframe


【解决方案1】:

这是一个可能的解决方案:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      相关资源
      最近更新 更多