2016-04-22 4 views
0

Я новичок в R и программировании в целом. Я имею следующие данные: screenshot enter image description hereПреобразование данных в фрейм данных

У меня есть 12 'IDs' (предметы исследования), пронумерованные 1-12. Столбец «types» указывает «тип» каждого идентификатора. Например, первые 5 номеров столбца «типы» относятся к «типам» первых 5 идентификаторов, т. Е. «Типы» первых 5 идентификаторов составляют 3,3,2,1,1 соответственно.

В столбце «пары» описывается, как идентификаторы соединяются вместе. Например, 6 сопряжено с 9; 4 соединен с 7; 1 сопряжен с 11 и так далее.

Так что мне нужна помощь в том, что я хочу создать три столбца, используя эти данные.

первый столбец: списки идентификатор (1-12)
второй столбец: возвращает идентификатор пары (например, 1 был соединен с 11, так что второй столбец должен сказать, 11 для ID 1)
третий столбец:. указывает тип «» пары (так что «типа» из 11 3. третий столбец должен показать, что

Вот визуализация желаемого выходного формата: output format enter image description here

Любая помощь будет очень признательна. Спасибо заранее!

ответ

1

Вы можете сделать это с помощью некоторой умной индексации. Я вошел в исходных данных в качестве вектора для типов, а также список векторов для пар:

# Enter the raw data 
type <- c(3, 3, 2, 1, 1, 1, 2, 3, 1, 1, 3, 1) 
pairs <- list(c(6, 9), c(4, 7), c(1, 11), c(3, 10), c(2, 12), c(5, 8)) 

Из этого, вы можете создать первые две колонки желаемых результатов путем укладки всех пар раз в оригинале порядок, а затем снова в обратном порядке. (Я отменил каждую пару с помощью lapply(pairs, rev), который применяет команду rev для каждой пары в списке.)

# Create a 12 x 2 matrix of the pairs 
pairs.mat <- do.call(rbind, c(pairs, lapply(pairs, rev))) 
pairs.mat 
#  [,1] [,2] 
# [1,] 6 9 
# [2,] 4 7 
# [3,] 1 11 
# [4,] 3 10 
# [5,] 2 12 
# [6,] 5 8 
# [7,] 9 6 
# [8,] 7 4 
# [9,] 11 1 
# [10,] 10 3 
# [11,] 12 2 
# [12,] 8 5 

Для чистоты результатов, я преобразовал это в data.frame:

# Convert to data frame 
colnames(pairs.mat) <- c("id", "match") 
df <- as.data.frame(pairs.mat) 

Наконец, мы можем получить столбец type_match, взяв тип в порядке столбца соответствия из только что созданного data.frame.

# Add in the type_match column 
df$type_match <- type[df$match] 

# Print results in order 
df[order(df$id), ] 
# id match type_match 
# 3 1 11   3 
# 5 2 12   1 
# 4 3 10   1 
# 2 4  7   2 
# 6 5  8   3 
# 1 6  9   1 
# 8 7  4   1 
# 12 8  5   1 
# 7 9  6   1 
# 10 10  3   2 
# 9 11  1   3 
# 11 12  2   3 

И это должно дать вам желаемый результат.

+0

Спасибо за помощь! Еще одно: для списка «пары» в начале есть способ напрямую прочитать эти пары из файла .csv? Причина, по которой я прошу об этом, - это дать только один раунд спаривания; есть еще несколько. Итак, я надеялся написать функцию, которая считывает последовательность спаривания из CSV-файла для каждого раунда, а затем переходит с кодом, который вы указали. Еще раз спасибо за помощь! –

+0

@AkhtarShah Возможно, но как выглядит CSV? –

+0

[ссылка на канал csv] (https://www.dropbox.com/s/7icth1rmv9801i3/config_custom_short_72.csv?dl=0) Не знаю, как поделиться этим в комментариях; поэтому ссылка. –

Смежные вопросы