Дублирующий столбец в кадре данных в R - PullRequest
0 голосов
/ 05 марта 2020

У меня есть пример кадра данных ниже:

Name       Class      ID
Terry      C-02       100
Jane       C-03       101
Tom        C-04       102

Я хочу продублировать столбец идентификатора и поместить его в начало кадра данных следующим образом:

ID       Name      Class      ID
100      Terry     C-02       100
101      Jane      C-03       101
102      Tom       C-04       102

Я пытался :

id_col <- as.data.frame(df$ID)
new_df <- cbind(id_col, df)

Но я получаю "Большую матрицу" вместо обычного кадра данных.

Ответы [ 4 ]

4 голосов
/ 05 марта 2020

Вот мои 50 век.

df1[c(3, 1:3)]
#    ID  Name Class ID.1
# 1 100 Terry  C-02  100
# 2 101  Jane  C-03  101
# 3 102   Tom  C-04  102

cbind(df1[3], df1)
#    ID  Name Class  ID
# 1 100 Terry  C-02 100
# 2 101  Jane  C-03 101
# 3 102   Tom  C-04 102
3 голосов
/ 05 марта 2020

Вот несколько подходов:

Используйте идентификатор как attribute, чтобы избежать дублирования имен:

structure(df, row.names= df$ID)
     Name Class  ID
100 Terry  C-02 100
101  Jane  C-03 101
102   Tom  C-04 102

Используйте dplyr * select, чтобы ввести новый дубликат ID:

    df %>% 
 mutate(new_ID = ID) %>% 
 select(new_ID, everything())
  new_ID  Name Class  ID
1    100 Terry  C-02 100
2    101  Jane  C-03 101
3    102   Tom  C-04 102

base:

 data.frame(ID=df$ID,df,check.names = FALSE)
   ID  Name Class  ID
1 100 Terry  C-02 100
2 101  Jane  C-03 101
3 102   Tom  C-04 102
2 голосов
/ 05 марта 2020

Еще один (на самом деле близко к тому, что вы пытались изначально):

df1 <- cbind(df[, c(3, 1:2)], ID=df$ID)
df1
   ID  Name Class  ID
1 100 Terry  C-02 100
2 101  Jane  C-03 101
3 102   Tom  C-04 102
1 голос
/ 05 марта 2020

Предполагая, что вы хотите точно отобразить результат, основная проблема состоит в том, чтобы R не переименовал второй экземпляр имени столбца с ID на ID.1. Если мы конвертируем в список и обратно, тогда мы можем использовать check.names = FALSE на as.data.frame следующим образом:

as.data.frame(as.list(DF)[c(3, 1:3)], check.names = FALSE)

, давая:

   ID  Name Class  ID
1 100 Terry  C-02 100
2 101  Jane  C-03 101
3 102   Tom  C-04 102

Примечание

Lines <- "Name       Class      ID
Terry      C-02       100
Jane       C-03       101
Tom        C-04       102"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...