Скажем, у меня есть 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 'может быть одним из двух строковых значений (' item ',' ratio '),' roi 'может быть одним из трех (' object ',' ratio ',' pic '). Например (извините за плохое кодирование)
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 в списке и создать новый столбец с именем «type», который содержит одно из трех значений в строке («busy», «empty» или «nil»). Эти значения основаны на следующем:
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 легче сделать это без лапы, но у меня есть много dfs в фактическом списке и я хочу применить эту функцию к каждому из них.
Заранее спасибо!