【问题标题】:Copy unique values from one column to another R将唯一值从一列复制到另一列
【发布时间】:2012-11-16 10:42:42
【问题描述】:

我最近开始使用 R,虽然我有它的手册,但我一直发现在那里找不到我需要的功能。这是我偶然发现的一个问题。

我的数据看起来像这样:

col1    col2    col3
Alex    NA  URL
Mike    URL NA
John    URL URL
Peter   NA  NA
James   NA  URL

Col1 将始终是唯一的分类值。 Col2 代表这些人来自哪里,到我的网站(URL 表示那里有一个完整的 URL,可以是 http.www.facebook.com)。 NA 表示用户病毒式访问我的网站。 Col3 表示引用(用户来自哪里的另一个指示)。

我需要做的是根据以下条件将数据从 col3 传输或复制到 col2:如果在 col 3 我有一个 URL,而在 col2 我有 NA,那么我需要来自 col3 的 URL 的单元格它复制到col2。如果 col3 和 col2 都有 URL,那么我不想在那里发生任何事情。如果 col 3 有 NA 并且 col2 有 URL,我也不希望有任何改变。这是所需的输出

col1    col2                    col3   
Alex    URL(copied from col3)   URL
Mike    URL(kept this URL)      NA
John    URL(kept this URL)      URL
Peter   NA(Kept NA)             NA
James   URL(copied from col3)   URL

所以,Alex 和 James 从 col3 获得了 URL,John 和 Mike 保留了 col2 中的初始 URL,而 Peter 保留了他的 NA。

现在,我到处寻找,甚至在这个网站上也找不到任何关于使用“IF”条件将数据从一列复制到另一列的信息。我发现的唯一一件事是如何使用“合并”功能将一整列从一个数据帧复制到另一个数据帧,但除此之外别无其他。

是否存在可以完成此任务的函数?

【问题讨论】:

  • 您忘记添加语言标签 [r],这会让人很难回答您的问题。

标签: r


【解决方案1】:

您的示例无法重现,因此我必须自己创建一些示例:

dat = data.frame(name = sample(c("John", "James", "Peter"), size = 10, replace = TRUE),
                 source = sprintf("http://www.%s.com", sample(LETTERS, size = 10)),
                 referal = sprintf("http://www.%s.com", sample(LETTERS, size = 10)))
# Introduce some NA's
dat[c(1,3,9), "source"] <- NA
dat[c(2,7), "referal"] <- NA
> dat
    name           source          referal
1   John             <NA> http://www.W.com                          
2  James http://www.M.com             <NA>                          
3   John             <NA> http://www.Z.com                          
4  Peter http://www.J.com http://www.L.com                          
5  Peter http://www.L.com http://www.H.com                          
6  Peter http://www.T.com http://www.U.com                          
7  James http://www.E.com             <NA>                          
8  Peter http://www.K.com http://www.K.com                          
9  Peter             <NA> http://www.R.com                          
10 James http://www.Z.com http://www.N.com 

你要找的函数叫做ifelse

dat = within(dat, { 
      source = as.character(source)
      referal = as.character(referal)
      source = ifelse(is.na(source), referal, source) 
    } )
> dat
    name           source          referal
1   John http://www.W.com http://www.W.com                          
2  James http://www.M.com             <NA>                          
3   John http://www.Z.com http://www.Z.com                          
4  Peter http://www.J.com http://www.L.com                          
5  Peter http://www.L.com http://www.H.com                          
6  Peter http://www.T.com http://www.U.com                          
7  James http://www.E.com             <NA>                          
8  Peter http://www.K.com http://www.K.com                          
9  Peter http://www.R.com http://www.R.com                          
10 James http://www.Z.com http://www.N.com   

【讨论】:

  • 嗨,保罗。首先感谢您告诉我有关标记 R 语言的信息,从现在开始将记住这一点 :)。我已经尝试过你的方法,但它似乎对我不起作用。出于某种原因,它用随机数替换了 Source 列中的值。我怎样才能像你一样截取 R 输出的屏幕截图,这样我可以给你看这个?大卫
  • 问题可能是在您的情况下source 列是factor。请使用as.character 将其转换为character 列。我将此编辑为我的答案。
  • 解决了。再次非常感谢您的帮助,我非常感谢。如果你喜欢挑战,我可能很快就会为你准备另一个挑战。 :)) 所有最好的大卫罗杰斯。 PS:它是关于将 URL 分解成更小的部分并从中获取特定的信息,有点像 excel 中的“文本到列”。我会尽快写出完整的例子。
  • 如果您认为这回答了您的问题,请按绿色对勾。这向所有人表明问题已被回答。
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2016-03-15
  • 2023-03-17
相关资源
最近更新 更多