在R中的数据帧的列中进行迭代(循环)

时间:2019-09-24 17:25:27

标签: r dataframe for-loop filter

我在R中苦苦挣扎,希望有人能帮助我。我正在尝试编写一个for循环来遍历数据帧的列,但是不幸的是,我没有成功。

这是我的问题: 我有10个数据帧(dt1,dt2,dt3,…,dt10)。例如,dt1看起来像这样:

dt1<-data.frame(Topic1=c(1,2,3,4,5,6,7,8,9),Topic2=c(9,8,7,6,5,4,3,2,1), Topic3=c(1,9,2,8,3,7,4,6,5), Name=c("A","A","A","A","A","B","B","B","B"))

当我过滤主题1(然后是主题2,主题3…)以大于5进行过滤时,我想检查Name变量是否仍然包含“ A”和“ B”。目前,我执行以下操作

Library(dpylr)

dt.new<-dt1 %>% filter(Topic1>5)
isTRUE("A" %in% dt.new$Name && "B" %in% dt.new$Name)

最后,对于每个数据框,我想要一个新表(数据框),如下所示:

result<-data.frame(Topic=c("Topic1","Topic2","Topic3"),Return=c("FALSE","FALSE","TRUE"))

现在的问题是,我有几个数据帧(dt1,dt2…),每个数据帧都有50多个变量(Topic1,…,Topic50)。

到目前为止,我已经编写了一些循环并进行了尝试。但不幸的是没有成功。因此,我很高兴收到任何提示或提示。

非常感谢您!

1 个答案:

答案 0 :(得分:1)

一种选择是通过检查是否有大于5的summarise值,然后按any对具有以'Topic'开头的列名的变量进行分组。 {1}}(不赞成使用-在较新的gather中使用tidyr)通过检查是否按“主题”列(pivot_longer分组)从“宽”转换为“长” summarise'val'元素为TRUE

all

或者先将其整形为'long'格式,然后进行library(dplyr) library(tidyr) dt1 %>% group_by(Name) %>% summarise_at(vars(starts_with('Topic')), ~ any(. > 5)) %>% gather(Topic, val, -Name) %>% group_by(Topic) %>% summarise(Return = all(val)) # A tibble: 3 x 2 # Topic Return # <chr> <lgl> #1 Topic1 FALSE #2 Topic2 FALSE #3 Topic3 TRUE

summarise