Скажем, у меня есть 2 фрейма данных, каждый с двумя столбцами 'pic_type' и 'roi' (на самом деле у меня намного больше фреймов данных, но в этом примере подойдут 2)
a <- setNames(data.frame(matrix(ncol = 2,nrow =6)), c("pic_type","roi"))
b <- setNames(data.frame(matrix(ncol = 2,nrow =6)), c("pic_type","roi"))
В каждом фрейме данных «pic_type» может быть одним из двух строковых значений («элемент», «отношение»), «roi» может быть одним из трех («объект», «отношение», «изображение»). Например (извините за плохое кодирование)
a$pic_type <- c("item", "item", "item","relation","relation","relation")
a$roi <- c("object", "object", "pic", "object", "relation","relation")
b$pic_type <- c("item", "item", "item","relation","relation","relation")
b$roi <- c("relation", "relation", "object", "pic", "pic","object")
Который дает:
'a'
pic_type roi
item object
item object
item pic
relation object
relation relation
relation relation
'b'
pic_type roi
item relation
item relation
item object
relation pic
relation pic
relation object
И поместите их в список
myList <- list(a,b)
Теперь я хочу использовать lapply для просмотра каждого df в списке и создания нового столбца с именем «тип», который содержит одно из трех значений для каждой строки («занято», «пусто» или «ноль»). Эти значения основаны на следующем:
If pic_type = "item" & roi = "object", then type = "occupied"
If pic_type = "relation" & roi = "relation", then type = "occupied"
If pic_type = "item" & roi = "relation", then type = "empty"
If pic_type = "relation" & roi = "object", then type = "empty"
Otherwise type = "nil"
Например:
'a'
pic_type roi type
item object occupied
item object occupied
item pic nil
relation object empty
relation relation occupied
relation relation occupied
Я пробовал следующее:
myList <- lapply(myList, function(x) for(row in 1:dim(x)[1]) {
if(as.data.frame(x)[row,1] == "item" && as.data.frame(x)[row,2]=="object") {as.data.frame(x)[row,3] == "occupied"}
else if(as.data.frame(x)[row,1] == "relation" && as.data.frame(x)[row,2]=="relation") {as.data.frame(x)[row,3] == "occupied"}
else if(as.data.frame(x)[row,1] == "item" && as.data.frame(x)[row,2]=="relation") {as.data.frame(x)[row,3] == "empty"}
else if(as.data.frame(x)[row,1] == "relation" && as.data.frame(x)[row,2]=="object") {as.data.frame(x)[row,3] == "empty"}
else {as.data.frame(x)[row,3] == "null"}})
Однако это вызывает ошибку:
Error in if (as.data.frame(x)[row, 1] == "item" && as.data.frame(x)[row, :
missing value where TRUE/FALSE needed
Может кто-нибудь предложить решение? Я знаю, что всего с двумя dfs это легче сделать без lapply, но у меня много dfs в фактическом списке, и я хочу применить эту функцию к каждому из них.
Заранее спасибо!