Как создать новую таблицу из исходных данных и таблицы поиска в R или Matlab? - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть исходные данные о температуре в table1.txt с заголовком номера станции, который читается как

Date       101    102    103    
1/1/2001   25     24     23      
1/2/2001   23     20     15      
1/3/2001   22     21     17      
1/4/2001   21     27     18     
1/5/2001   22     30     19     

У меня есть файл таблицы поиска lookup.txt, который читается как:

ID  Station
1   101
2   103
3   102
4   101
5   102

Теперь я хочу создать новую таблицу (new.txt) с идентификатором заголовка, который должен читаться как

    Date        1      2       3     4     5    
    1/1/2001   25     23      24     25    24
    1/2/2001   23     15      20     23    20
    1/3/2001   22     17      21     22    21
    1/4/2001   21     18      27     21    27
    1/5/2001   22     19      30     22    30

Есть ли в любом случае, я могу сделать это в R или Matlab ??

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Мы можем использовать base R, чтобы сделать это.Создайте индекс столбца с помощью match, используя столбец 'Station' с names первого набора данных, используйте его для дублирования столбцов 'df1', а затем измените имена столбцов с помощью столбца 'ID' второго набора данных

i1 <- with(df2, match(Station, names(df1)[-1]))
dfN <- df1[c(1, i1 + 1)]
names(dfN)[-1] <- df2$ID
dfN
#      Date  1  2  3  4  5
#1 1/1/2001 25 23 24 25 24
#2 1/2/2001 23 15 20 23 20
#3 1/3/2001 22 17 21 22 21
#4 1/4/2001 21 18 27 21 27
#5 1/5/2001 22 19 30 22 30

данные

df1 <- structure(list(Date = c("1/1/2001", "1/2/2001", "1/3/2001", "1/4/2001", 
"1/5/2001"), `101` = c(25L, 23L, 22L, 21L, 22L), `102` = c(24L, 
20L, 21L, 27L, 30L), `103` = c(23L, 15L, 17L, 18L, 19L)), 
 class = "data.frame", row.names = c(NA, 
-5L))

df2 <- structure(list(ID = 1:5, Station = c(101L, 103L, 102L, 101L, 
102L)), class = "data.frame", row.names = c(NA, -5L))
0 голосов
/ 25 ноября 2018

Вот вариант с MatLab:

T = readtable('table1.txt','FileType','text','ReadVariableNames',1);
L = readtable('lookup.txt','FileType','text','ReadVariableNames',1);
old_header = strcat('x',num2str(L.Station));
newT = array2table(zeros(height(T),height(L)+1),...
    'VariableNames',[{'Date'} strcat('x',num2cell(num2str(L.ID)).')]);
newT.Date = T.Date;
for k = 1:size(old_header,1)
    newT{:,k+1} = T.(old_header(k,:));
end
writetable(newT,'new.txt','Delimiter',' ')
0 голосов
/ 25 ноября 2018

Я придумал решение с использованием Tidyverse.Он включает некоторое широкое преобразование в длинное, сопоставление кадров данных на станции, а затем распространение переменных.

#Recreating the data

library(tidyverse)

df1 <- read_table("text1.txt")

lookup <- read_table("lookup.txt")

#Create the output
k1 <- df1 %>% 
       gather(Station, value, -Date) %>%
       mutate(Station = as.numeric(Station)) %>%
       inner_join(lookup) %>% select(-Station) %>%
       spread(ID, value)

k1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...