разделить фрейм данных на несколько таблиц на основе условного поиска - PullRequest
0 голосов
/ 10 января 2019

У меня есть таблица как:

ID A10 A11 A12 A20 A21 A22 A30 A31 A32
Apple 1 1 1 1 1 1 1 1 1
Banana 2 2 2 2 2 2 2 2 2
Pear 3 3 3 3 3 3 3 3 3

Мой первый вопрос: могу ли я использовать что-то вроде "*" для подстановки нескольких столбцов? Например, если я хочу создать подмножество столбцов, содержащих A2 (A20, A21, A22), как я могу сделать это быстро?

Мой второй вопрос: как разделить этот фрейм данных на несколько таблиц? Я хотел бы разделить эту базу данных на "A1" "A2" и "A3" (в связи с моим первым вопросом), что будет:

df1<-
ID A10 A11 A12
Apple 1 1 1
Banana 2 2 2
Pear 3 3 3

df2<-
ID A20 A21 A22
Apple 1 1 1
Banana 2 2 2
Pear 3 3 3

df3<-
ID A30 A31 A32
Apple 1 1 1
Banana 2 2 2
Pear 3 3 3

Как я могу это сделать?

В другом случае у меня есть фрейм данных, что длина символов в именах столбцов различна, например:

ID BSS20 BSS40 BSS60 W01 W02 W03 BW20 BW40 BW60 SS20 SS40 SS60
Apple 1 1 1 1 1 1 1 1 1
Banana 2 2 2 2 2 2 2 2 2
Pear 3 3 3 3 3 3 3 3 3

Как разделить данные на три новых кадра данных, каждый из которых должен содержать W0, например:

df1<-
ID BSS20 BSS40 BSS60 W01 W02 W03
Apple 1 1 1 1 1 1
Banana 2 2 2 2 2 2
Pear 3 3 3 3 3 3

df2<-
ID BW20 BW40 BW60 W01 W02 W03
Apple 1 1 1 1 1 1
Banana 2 2 2 2 2 2
Pear 3 3 3 3 3 3

df3<-
ID SS20 SS40 SS60 W01 W02 W03
Apple 1 1 1 1 1 1
Banana 2 2 2 2 2 2
Pear 3 3 3 3 3 3

Мои столбцы состоят из *20 *40 *60 и трех специальных символов W01 W02 W03, как я могу их хорошо выразить в r?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете разделить несколько фреймов данных, используя код ниже.

df <- read.table(text="ID A10 A11 A12 A20 A21 A22 A30 A31 A32
Apple 1 1 1 1 1 1 1 1 1
Banana 2 2 2 2 2 2 2 2 2
Pear 3 3 3 3 3 3 3 3 3",header = T)


df1<-df[ , grepl( "A1" , names(df) ) ]
df2<-df[ , grepl( "A2" , names(df) ) ]
df3<-df[ , grepl( "A3" , names(df) ) ]
0 голосов
/ 10 января 2019

Да, вы можете разделить фрейм данных на несколько таблиц, используя split.default. В этом случае мы можем извлечь первые два символа из имен столбцов, чтобы разделить их

split.default(df[-1], substr(names(df)[-1], 1, 2))

#$A1
#  A10 A11 A12
#1   1   1   1
#2   2   2   2
#3   3   3   3

#$A2
#  A20 A21 A22
#1   1   1   1
#2   2   2   2
#3   3   3   3

#$A3
#  A30 A31 A32
#1   1   1   1
#2   2   2   2
#3   3   3   3

Если вы хотите добавить первый столбец в каждый список, вы можете cbind добавить его в каждый список

lapply(split.default(df[-1], substr(names(df)[-1], 1, 2)), cbind, df[1])

EDIT

Для обновленных данных мы можем создать две группы, общие столбцы (common_cols) и разные столбцы (diff_cols)

common_cols <-c("ID", "W01", "W02", "W03")
diff_cols <- setdiff(names(df), common_cols)

затем делите только на diff_cols и cbind common_cols для каждого списка.

lapply(split.default(df[diff_cols], substr(names(df[diff_cols]), 1, 2)), 
        cbind, df[common_cols])

#$BS
#  BSS20 BSS40 BSS60     ID W01 W02 W03
#1     1     1     1  Apple   1   1   1
#2     2     2     2 Banana   2   2   2
#3     3     3     3   Pear   3   3   3

#$BW
#  BW20 BW40 BW60     ID W01 W02 W03
#1    1    1    1  Apple   1   1   1
#2    2    2    2 Banana   2   2   2
#3    3    3    3   Pear   3   3   3

#$SS
#  SS20 SS40 SS60     ID W01 W02 W03
#1    1    1    1  Apple   1   1   1
#2    2    2    2 Banana   2   2   2
#3    3    3    3   Pear   3   3   3
...