【问题标题】:comparing other data frames and selecting rows in for loop in R比较其他数据帧并在 R 中的 for 循环中选择行
【发布时间】:2022-01-01 18:13:54
【问题描述】:

我的算法中有一些复杂的条件,我无法处理它们。我需要帮助。

我有 4 个数据框,包括索引号和输出,例如

u1 = data.frame(index = c(1,3,12,21,24),output =c(1,0,1,0,1), u2 = data.frame(index = c(2,5,16,1),output =c(0,1,1,0)` , u3 = data.frame(index = c(1,5,7,16),output =c(0,1,0,0) , u4 = data.frame(index = c(21,24,8),output =c(0,0,1).

我尝试在 R 中编写一个for(i in 1:4) 循环(如果您可以在没有 for 循环的情况下解决,欢迎您)。在每个步骤中,第 i 个循环将检查其他数据帧的索引号(例如,在步骤 i=1 中,检查 u2、u3、u4),如果任何索引号在其他数据帧中重复至少 2 次,我将采取它。之后,我将检查这些相同索引的输出。如果这些索引的输出相同,我将选择该索引号。让我举一个关于我上面的数据框的例子,i = 1; 检查 u2、u3 和 u4 的索引。索引号 5 重复 2 次(输出相同, 1 ),我将选择它,索引号 1 重复 2 次,输出相同我将选择它,索引号 16 重复 2 次,但输出不同,这就是为什么我不会选择它。

i =2; 检查 u1、u3 和 u4 的索引...

谢谢。

【问题讨论】:

  • @akrun 你能检查一下这个问题吗?我已编辑。谢谢

标签: r for-loop


【解决方案1】:

也许这有帮助 - 获取 list ('lst1') 中的 'u1'、'u2'、... 对象,然后遍历 listnames,子集 list没有循环名称(setdiff),rbind,然后,得到table,根据'1'的频率计数创建一个逻辑向量,在此基础上提取names,转换命名为list到两列 data.frame (stack)

lst1 <- mget(ls(pattern = '^u\\d+$'))
stack(lapply(setNames(names(lst1), names(lst1)), 
    function(u) names(which(table(do.call(rbind, lst1[setdiff(names(lst1), 
    u)]))[,'1'] > 1))))[2:1]
   ind values
1  u1      5
2  u4      5

数据

u1 <- structure(list(index = c(1, 3, 12, 21, 24), output = c(1, 0, 
1, 0, 1)), class = "data.frame", row.names = c(NA, -5L))

u2 <- structure(list(index = c(2, 5, 16, 1), output = c(0, 1, 1, 0)), class = "data.frame", row.names = c(NA, 
-4L))

u3 <- structure(list(index = c(1, 5, 7, 16), output = c(0, 1, 0, 0)), class = "data.frame", row.names = c(NA, 
-4L))

u4 <- structure(list(index = c(21, 24, 8), output = c(0, 0, 1)), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多