2014-11-03 4 views
0

Я использую R и нужна подсказка, чтобы решить мою проблему:Сравните первый элемент списка с другим списком

У меня есть два списка, и я хочу, чтобы сравнить значения в первой строке списка «а» с значения первой строки списка «b». Если элемент существует, я хочу записать значение второй строки списка «b» во вторую строку списка «a».

Итак, вот список "а":

X.WORD FREQ 
abase  0 
abased 0 
abasing 0 
abashs 0 

здесь список "б"

V1  V2 
arthur 11 
abased 29 
turtle 9 
abash  2 

Результат должен быть

X.WORD FREQ 
abase  0 
abased 29 
abasing 0 
abashs 0 

Спасибо за ваши ответы

+0

Что делать, если "унизил" был в строке 3 вашего «списка b»? Возможно, вы просто ищете 'merge()' .. –

+0

Они выглядят как фреймы данных, а не списки. Это так? –

+0

Право, а не списки. Это оба кадра данных. –

ответ

1

Вот один из подходов.

library(dplyr) 

ana <- foo %>% 
    left_join(foo2, by = c("X.WORD" = "V1")) %>% 
    select(-FREQ) %>% 
    rename(FREQ = V2) 

ana$FREQ[is.na(ana$FREQ)] <- 0 

# X.WORD FREQ 
#1 abase 0 
#2 abased 29 
#3 abasing 0 
#4 abashs 0 

данных

foo <- structure(list(X.WORD = structure(c(1L, 2L, 4L, 3L), .Label = c("abase", 
"abased", "abashs", "abasing"), class = "factor"), FREQ = c(0L, 
0L, 0L, 0L)), .Names = c("X.WORD", "FREQ"), class = "data.frame", row.names = c(NA, 
-4L)) 

foo2 <- structure(list(V1 = structure(c(3L, 1L, 4L, 2L), .Label = c("abased", 
"abash", "arthur", "turtle"), class = "factor"), V2 = c(11L, 
29L, 9L, 2L)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-4L)) 
+0

Появляется следующее сообщение об ошибке: Ошибка: не может присоединиться к столбцам «V1» x «X.WORD»: индекс за пределами –

+0

@ RogerSánchezNa Спасибо за ваше сообщение. Я проверил код с данными. Он работает на моей машине. Не могли бы вы его проверить? – jazzurro

2

Это просто задача для простого merge в базе R

Res <- merge(a, b, by.x = "X.WORD", by.y = "V1", all.x = TRUE)[, -2] 
Res$V2[is.na(Res$V2)] <- 0 
Res 
# X.WORD V2 
# 1 abase 0 
# 2 abased 29 
# 3 abashs 0 
# 4 abasing 0 

данных

a <- structure(list(X.WORD = structure(c(1L, 2L, 4L, 3L), .Label = c("abase", 
"abased", "abashs", "abasing"), class = "factor"), FREQ = c(0L, 
0L, 0L, 0L)), .Names = c("X.WORD", "FREQ"), class = "data.frame", row.names = c(NA, 
-4L)) 

b <- structure(list(V1 = structure(c(3L, 1L, 4L, 2L), .Label = c("abased", 
"abash", "arthur", "turtle"), class = "factor"), V2 = c(11L, 
29L, 9L, 2L)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-4L)) 
+0

Да, это решение работает нормально. Спасибо, Дэвид. –

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