我有一组数字/字符串,可以组成其他数字/字符串。我需要创建一个函数,以提供创建该数字/字符串所需的所有数字/字符串的列表。
考虑以下数据集
ingredients <- c('N/A', 'cat', 'bird')
product <- c('cat', 'bird', 'dog')
data <- data.frame(ingredients, product)
head(data)
如果我输入function(dog),我想要一个列表,该列表先返回先返回Bird,然后再返回cat。该功能知道当配料= N / A时什么时候停止(没有什么可查找的了)。
似乎附加某种for循环是正确的方法。
needed <- list()
for (product in list){
needed[[product]]<-df
}
df <- dplyr::bind_rows(product)
答案 0 :(得分:0)
我附加了您的初始代码,以使N/A
仅等于NA
,因此可以在我的R代码中使用is.na
函数。现在示例数据为
ingredients <- c(NA, 'cat', 'bird')
product <- c('cat', 'bird', 'dog')
data <- data.frame(ingredients, product)
代码如下:
ReverseLookup <- function (input) {
ans <- list()
while (input %in% data$product) {
if (!is.na(as.character(data[which(data$product == input),]$ingredients))) {
ans <- append(ans, as.character(data[which(data$product == input),]$ingredients))
input <- as.character(data[which(data$product == input),]$ingredients)
}
else {
break
}
}
print(ans)
}
我创建一个空列表,然后创建一个while
循环,该循环仅检查input
列中是否存在product
。如果是这样,那么它将检查以查看与ingredient
输入对应的product
是否为非NA值。在这种情况下,ingredient
将附加到ans
并成为新的input
。我还添加了一条break
语句,以在到达while
时退出NA
循环。
我对您的数据框中没有NA
的情况进行了快速测试,它似乎工作正常。也许这里的其他人可以找到一种更简洁的编写方式,但是它应该对您有用。
答案 1 :(得分:0)
您可能会找到一种使用某种类型的树遍历节点的方法。但是,我在基数R中使用了递归函数。
我也将“ N / A”更改为NA
,以简化生活。另外,我已经在数据帧中添加了stringsAsFactors = F
。
ingredients <- c(NA, 'cat', 'bird')
product <- c('cat', 'bird', 'dog')
data <- data.frame(ingredients, product, stringsAsFactors = F)
reverse_lookup <- function(data, x, last_result = NULL) {
if (! is.null(last_result)) {
x <- data[data$product == last_result[length(last_result)], "ingredients"]
}
if (! is.na(x)) {
last_result <- reverse_lookup(data, x, c(last_result, x))
}
last_result
}
这也会返回输入,您可以随时将其作为向量的第一个元素放下。
> reverse_lookup(data, "dog")
[1] "dog" "bird" "cat"