当前位置: 首页 > 知识库问答 >
问题:

在多个列中搜索给定的值选择及其关联标签

微生自怡
2023-03-14

我有一个12列的数据帧,下面的数据帧是一个简化的示例

    ID <- c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5)                                   
    period<- c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2)                            
    column1<- c(100, 400, 500, 300, 700, 800, 300, 100, 1100, 100)      
    column2<- c(1500, 100,800,900,100,1100,1200,200,100,400)            
    column3<- c(200, 1000, 200,NA,500,800,1100,300,100,2000)                    
    df<- data.frame(ID, period, column1, column2, column3) 

ID period column1 column2 column3
1      1     100    1500     200
1      2     400     100    1000
2      1     500     800     200
2      2     300     900      NA
3      1     700     100     500
3      2     800    1100     800
4      1     300    1200    1100
4      2     100     200     300
5      1    1100     100     100
5      2     100     400    2000

1)我了解值100,200和300,并且如果这些值在列1中可用,则要添加一个包含1的新列(列4),如果这些值在列1中可用,则为0,如果这些值不可用。

2)如果这些值(100,200,300)可用,我想从lookup_table中查找属于这些值的名称。

agent_number<- c(100, 200, 300)
agent_name<- c("agent1", "agent2", "agent3")
lookup_table<- data.frame(agent_number, agent_name)

这是我想要的输出。

ID period column1 column2 column3 column4 column5 column6 column7
 1      1     100    1500     200       1  agent1  agent2    <NA>
 1      2     400     100    1000       1  agent1    <NA>    <NA>
 2      1     500     800     200       1  agent2    <NA>    <NA>
 2      2     300     900      NA       0  agent3    <NA>    <NA>
 3      1     700     100     500       1  agent1    <NA>    <NA>
 3      2     800    1100     800       0    <NA>    <NA>    <NA>
 4      1     300    1200    1100       1  agent3    <NA>    <NA>
 4      2     100     200     300       1  agent1  agent2  agent3
 5      1    1100     100     100       1  agent1  agent1    <NA>
 5      2     100     400    2000       1  agent1    <NA>    <NA>

对于问题1,我尝试过,但没有成功。

agent_number<- c("100", "200", "300")
df %>% select(ID, column1:column3) %>%
mutate_at(vars(column1:column3),list(~ ifelse(. == agent_number, 1, 0)))

对于问题2,我对原始数据帧中的12列中的每一列都使用了left_join,但在合并表后无法更改列1到12的名称。我每次都得到如下相同的输出。

left_join(df, lookup_table, by=c("column1"="agent_number"), suffix = c("", ".1"), suffixes_mandatory = c(FALSE, TRUE))
left_join(df, lookup_table, by=c("column2"="agent_number"), suffix = c("", ".2"), suffixes_mandatory = c(FALSE, TRUE))
ID period column1 column2 column3 agent_name
 1      1     100    1500     200       <NA>
 1      2     400     100    1000       <NA>
 2      1     500     800     200       <NA>
 2      2     300     900      NA       <NA>
 3      1     700     100     500       <NA>
 3      2     800    1100     800       <NA>
 4      1     300    1200    1100       <NA>
 4      2     100     200     300       <NA>
 5      1    1100     100     100       <NA>
 5      2     100     400    2000       <NA>

我有大的数据文件,我在寻找一个代码,不工作非常慢。非常感谢您的任何建议。

共有1个答案

卢皓轩
2023-03-14

data.table解决方案

# Convert your dataframe to a data.table with setDT
setDT(df)

# Initiate column to all zeros
df$column4 <- 0
# Where column1, column2, or column3 is in 100,200,300
df[column1 %in% c(100,200,300) | 
   column2 %in% c(100,200,300) | 
   column3 %in% c(100,200,300), 
   column4 := 1]

# Begin to map values
df$column5 <- NA
df$column6 <- NA
df$column7 <- NA

# Map values solution from 
#https://stackoverflow.com/questions/20565949/replace-values-in-data-frame-with-other-values-according-to-a-rule
require(plyr)
df$column5 <- mapvalues(df$column1, 
          from=c(100,200,300), 
          to=c("agent1","agent2","agent3"))
df$column6 <- mapvalues(df$column2, 
          from=c(100,200,300), 
          to=c("agent1","agent2","agent3"))
df$column7 <- mapvalues(df$column3, 
          from=c(100,200,300), 
          to=c("agent1","agent2","agent3"))
 类似资料:
  • 我想索引和搜索使用Lucene索引的数据片段。 例如。物品及其颜色 搜索示例 可能的解决办法 根据我在答案中发现的,显然我可以使用这种格式将这些添加到一个字段中。 如果我现在用这种格式的数据进行搜索,我不会得到任何结果。 null

  • 本文向大家介绍Yii2 ActiveRecord多表关联及多表关联搜索的实现,包括了Yii2 ActiveRecord多表关联及多表关联搜索的实现的使用技巧和注意事项,需要的朋友参考一下 Yii的ActiveRecord是与数据库打交道的类,也即MVC中的M(模型层),也是ORM的O(Object)。 一个老生常谈的问题。最近通过群里的反馈,觉得很多人还是没有去理解这个问题。今天把这个问题讲明白了

  • 因此,问题实际上是: 我创建(从熊猫文档直接复制粘贴)数据框: 这将创建一个像这样的DataFrame:(其中最左边的列实际上是索引) 然后我想给我的名字分配col2和row1的值,即4。但是我想根据col1中的值来做这件事(因为我知道这个值)。所以它看起来或多或少像这样: 我知道这没有意义,但也许有人理解这个问题,并提出了一个提示:)可能这是非常容易做到的,但我现在可以把我的头包在所有的. lo

  • 问题内容: 您如何在中搜索密钥?在此程序中,当用户输入密钥时,代码应安排在哈希图中搜索相应的值,然后进行打印。 请告诉我为什么它不起作用。 问题答案: 只需致电:

  • 问题内容: 两个或多个值中的最小值或最大值是可能的。我需要这样的东西: 我可以仅使用MySQL来实现吗? 问题答案: 您可以使用和功能来实现它。 两者都在这里描述了http://dev.mysql.com/doc/refman/5.0/en/comparison- operators.html

  • 我正在从flickrs API获取一些JSON。我的问题是exif数据的顺序因相机而异。所以我不能硬编码一个数组号来获得,例如,下面的相机型号。PHP是否有任何内置方法来搜索关联数组值并返回匹配数组?在下面的示例中,我想搜索