2013-11-11 2 views
0

У меня есть следующий dataframe:Применить функцию для каждой пары столбцов в R

Day A1 A2 B1 B2 C1 C2 
Mon 1 0 0 1 0 1 
Tue 1 0 1 0 0 1 
Wed 0 1 1 0 1 0 
Thu 0 1 0 1 1 0 

df <- data.frame(A1=c(1,1,0,0),A2=c(0,0,1,1),B1=c(0,1,1,0),B2=c(1,0,0,1),C1=c(0,0,1,1),C2=c(1,1,0,0), row.names=c('Mon','Tue','Wed','Thu')) 

Я хочу, чтобы получить как выход дней, которые имеют X1 = 1 и Х2 = 0, сгруппированные по буквам. Например, для буквы A, Mon и Tue соответствуют критериям A1 = 1 и A2 = 0.

Такое, что выход:

Список:

$A 
Mon 
Tue 

$B 
Tue 
Wed 

$C 
Wed 
Thu 

Или dataframe:

Lett Day 
A Mon 
A Tue 
B Tue 
B Wed 
C Wed 
C Thu 

Я пытался на следующее:

For A:

A <- df$A1 == 1 & df$A2 == 0 

Я хотел бы получить логический вектор как:

T 
T 
F 
F 

Затем сопоставить их с днями исходной БД:

A <- cbind(db[1], A) 

И фильтровать «TRUE» значения, чтобы получить выход

A 
Mon 
Tue 

Я мог бы сделать это для каждой буквы, но сценарий был бы слишком длинным, и проблема в том, что я мог бы иметь любое количество буквы (A, B .. Z)

+0

Можете ли вы понять, что есть X1 и X2? – Metrics

+1

@Metrics Довольно уверен, что 'X' предназначен для подстановки' * 'для каждой буквы: A, B, C ... – Thomas

+0

Точно, X = {A, B, .. Z) – rwn1v

ответ

2

Это один из способов использования split.default:

grped.cols <- split.default(df, substr(names(df), 1, 1)) 
cond <- function(x) row.names(df)[x[1] & ! x[2]] 
lapply(grped.cols, cond) 
# $A 
# [1] "Mon" "Tue" 
# 
# $B 
# [1] "Tue" "Wed" 
# 
# $C 
# [1] "Wed" "Thu" 
Смежные вопросы