Найдите уникальный уровень списка набора данных для каждого столбца - PullRequest
3 голосов
/ 10 июля 2020

У меня есть список из 18 наборов данных, каждый набор данных имеет несколько столбцов, как я пишу al oop, чтобы найти пересечение по индексу столбца и вернуть список индекса столбца.


df1 <- data.frame(id = c(1:5), loc = c("a","b","c","a","b"))
df2 <- data.frame(id = c(3:7), ta = c("c","b","d","a","b"))
df3 <- data.frame(id = c(1:5), az = c("d","a","e","d","b"))

df <- list(df1, df2, df3)
df <- lapply(df, function(i) lapply(i, function(j) as.character(j)))

intersect(df[[1]][1], df[[2]][1], df[[3]][1])
intersect(df[[1]][2], df[[2]][2], df[[3]][2])

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

С tidyverse мы можем использовать map/reduce

library(purrr)
library(dplyr)
map(df, pull, 1) %>% 
      reduce(intersect)
#[1] 3 4 5

Или как функцию

f1 <- function(lstA, ind) {
          map(lstA, pull, ind) %>%
             reduce(intersect)
 }


f1(df, 1)
#[1] 3 4 5
f1(df, 2)
#[1] "a" "b"
          
2 голосов
/ 10 июля 2020

Вы можете использовать Reduce в функции intersect и [ в sapply, чтобы выбрать номер подсписка.

Single:

Reduce(intersect, sapply(df, `[`, 1))
# [1] "3" "4" "5"
Reduce(intersect, sapply(df, `[`, 2))
# [1] "a" "b"

Или все вместе :

lapply(1:2, function(i) Reduce(intersect, sapply(df, `[`, i)))
# [[1]]
# [1] "3" "4" "5"
# 
# [[2]]
# [1] "a" "b"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...