2016-09-16 3 views
2

У меня есть процесс RM, который включает оператор «FP Growth» -> «Apply Association Rules». Таблица данных 1 является результатом этого процесса RM.Как извлечь данные из данных, сопоставляя столбцы (на основе определенных условий) в R

Теперь я хочу написать программу R с таблицей данных 1 в качестве входных данных и таблиц данных 2 в качестве выходного

Таблица данных 1

id confidence(a) a confidence(b) b 
100 1   TRUE  1  FALSE 
101 0   TRUE  0  FALSE 
102 1   TRUE  1  TRUE 
103 0   TRUE  0  TRUE 

Таблица данных 2

ID SET 
100 b 
101 none 
102 none 
103 none 

Вот является логикой получения таблицы данных таблицы 2 -

  1. для определенного идентификатора, когда доверие (a/b/anything) = 0, игнорировать их
  2. для определенного идентификатора, когда «доверие (a)» равно 1, а значение элемента «a» равно «TRUE» -> игнорируйте их
  3. для определенного идентификатора, когда «доверие (a)» равно 1, а значение «a» - «FALSE» -> упомянуть об этом в столбце «SET» (как показано в таблице данных 2).
  4. поэтому, когда доверие() = 1 и значение item = FALSE, все элементы с этими данными должны храниться в столбце «SET», где каждый элемент разделяется запятой

Пожалуйста, дайте мне знать, как я могу получить таблицу данных 2 Любая помощь будет оценена по достоинству. Спасибо

ответ

0

Я воссоздал таблице данных 1, как dt1:

dt1 <- data.frame(id=100:103, confidencea=c(1,0,1,0), a=rep(T,4), confidenceb=c(1,0,1,0), b=c(F,F,T,T)) 

str(dt1) 
'data.frame': 4 obs. of 5 variables: 
$ id   : int 100 101 102 103 
$ confidencea: num 1 0 1 0 
$ a   : logi TRUE TRUE TRUE TRUE 
$ confidenceb: num 1 0 1 0 
$ b   : logi FALSE FALSE TRUE TRUE 

#For the code below to work, the columns of dt1 must be in the format above. 
#If not, convert them to the correct format. 
#For example, if 'id' is in the format 'factor', use 'as.integer(as.character(dt1$id))'. 
#For example, if 'a' is in the format 'character', use 'as.logical(dt1$a)'. 

Затем код ниже создает dt2:

#Find columns where confidence is non-zero 
dt <- dt1[which(rowSums(dt1[grep('confidence', names(dt1))]) > 0),] 

#Find columns where value of item corresponding to a non-zero confidence is FALSE 
dtnames <- names(which(colSums(dt[grep('^(?!confidence|id)', names(dt), perl = T)]) < nrow(dt[grep('^(?!confidence|id)', names(dt), perl = T)]))) 
dt <- dt[,c(1, which(names(dt) %in% dtnames))] 
dt <- dt[which(rowSums(dt[-1]) < (ncol(dt)-1)),] 

#Collect names to be listed in SET column 
dt$SET <- 'none' 
for(i in 1:nrow(dt)){ 
    name <- character() 
    for(j in 2:ncol(dt)){ 
    if(dt[i,j]==F){ 
     name <- c(name, names(dt[j])) 
    } 
    } 
    dt$SET[i] <- paste(name, collapse=',') 
} 

#Keep only SET column and fill missing values with 'none' 
dt <- dt[c('id','SET')] 
dt2 <- merge(dt1[1],dt, all.x = T) 
dt2$SET[is.na(dt2$SET)] <- 'none' 
+0

Th anks для вашего ответа. Но в уверенности (a) доверие (b) - a, b - файлы. Аналогичным образом у меня есть еще много файлов, таких как доверие (c), уверенность (d) ..... Пожалуйста, дайте мне знать другую, чтобы решить эту проблему. – user2014

+0

Я изменил код на более общий. Теперь он должен работать независимо от того, сколько столбцов у вас есть. –

+0

Ошибка «x должна быть числовой», умноженная на четвертую строку кода – user2014

-1

Это может быть не лучший способ сделать это. Но это можно сделать с помощью простых ifelse() и для цикла. Следующий код может сделать необходимый для данного примера. Возможно, вам придется изменить его в соответствии с вашими требованиями.

# Explaining Variables 
id = c(100,101,102,103) 
confidence_a = c(1,0,1,0) 
a = c(TRUE ,TRUE,TRUE,TRUE) 
confidence_b = c(1,0,1,0) 
b = c(FALSE,FALSE,TRUE,TRUE) 

# Create Dataframe using above declared variables 
Data_Table_1 = data.frame(id, confidence_a,a,confidence_b , b) 
colnames(Data_Table_1) = c("id" , "confidence_a" , "a" , "confidence_b"  ,"b") 

# Defining Null Vectors 
SET = c() 
SET_a = c() 
SET_b = c() 
# Loop to iterate over each of the row 
for(i in 1:nrow(Data_Table_1)){ 

     SET_a[i] = ifelse((Data_Table_1$confidence_a[i] == 0),"none", 
        ifelse((Data_Table_1$confidence_b[i] == 0),"none", 
         ifelse(Data_Table_1[i ,3] == "FALSE" ,colnames(Data_Table_1)[3],"none"))) 

      SET_b[i] = ifelse((Data_Table_1$confidence_a[i] == 0),"none", 
          ifelse((Data_Table_1$confidence_b[i] == 0),"none", 
           ifelse(Data_Table_1[i ,5] == "FALSE" ,colnames(Data_Table_1)[5],"none"))) 

        SET[i] = ifelse((SET_a[i] != "none")&(SET_b[i]!= "none") ,paste(SET_a[i] ,SET_b[i],sep = ","), 
            ifelse(SET_a[i] != "none",SET_a[i] , 
             ifelse(SET_b[i] !="none", SET_b[i],"none")))} 

Вы можете оптимизировать заданный код, добавляя больше циклов над столбцами.

0

Один из подходов к этой проблеме состоит в преобразовании первого кадра данных (настоящее имя df1) с шириной до длинного формата, используя tidyr::gather, а затем действовать на полученных ключи и значений столбцов данных (сгруппированных по id) в строке попарного моды для оценки того, что должно быть в результате SET. Затем, summarise, используя функцию, чтобы свернуть строки к строке (символьный вектор). Для этого подхода к работе мы должны иметь чередующуюся уверенность и соответствующие столбцы элементов, как в OP.

Сначала определит две функции:

f <- function(k, v) { 
    o <- rep(NA,length(v)) 
    o[c(FALSE,TRUE)] <- ifelse(v[c(TRUE,FALSE)]==1 & v[c(FALSE,TRUE)]==0, k[c(FALSE,TRUE)], NA) 
    o 
} 

f2 <- function(x) { 
    x <- na.omit(x) 
    if (length(x)==0) "none" else toString(x) 
} 

Первая функция работает в колоннах длинного формата в попарной моде генерировать либо (NA, NA) или (NA, item) для каждой пары строк на основе состояния. Вторая функция удаляет все NA, а затем сворачивает строку в строку, разделенную запятой.Если все элементы в строке: NA, то эта функция возвращает "none" в соответствии с запросом. С помощью этих функций, используя dplyr:

library(dplyr) 
library(tidyr) 
df2 <- df1 %>% gather(key="key", value="Set", -id) %>% 
       group_by(id) %>% 
       mutate(Set=f(key,Set)) %>% 
       select(-key) %>% 
       summarise(Set=f2(Set)) 

На ваших данных:

print(df2) 
### A tibble: 4 x 2 
##  id Set 
## <int> <chr> 
##1 100  b 
##2 101 none 
##3 102 none 
##4 103 none 

Теперь немного более интересный набор данных с более чем один элемент, который удовлетворяет условию:

df1 <- structure(list(id = 100:103, `confidence(a)` = c(1L, 0L, 1L, 
0L), a = c(TRUE, TRUE, TRUE, TRUE), `confidence(b)` = c(1L, 0L, 
1L, 0L), b = c(FALSE, FALSE, TRUE, TRUE), `confidence(c)` = c(1L, 
0L, 1L, 0L), c = c(FALSE, TRUE, FALSE, FALSE)), .Names = c("id", 
"confidence(a)", "a", "confidence(b)", "b", "confidence(c)", 
"c"), class = "data.frame", row.names = c(NA, -4L)) 
## id confidence(a) a confidence(b)  b confidence(c)  c 
##1 100    1 TRUE    1 FALSE    1 FALSE 
##2 101    0 TRUE    0 FALSE    0 TRUE 
##3 102    1 TRUE    1 TRUE    1 FALSE 
##4 103    0 TRUE    0 TRUE    0 FALSE 

Мы получаем:

print(df2) 
### A tibble: 4 x 2 
##  id Set 
## <int> <chr> 
##1 100 b, c 
##2 101 none 
##3 102  c 
##4 103 none 
Смежные вопросы