将唯一值从一列复制到另一列

时间:2012-11-16 10:42:43

标签: r

我最近开始使用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代表referal(用户来自何处的另一个指示)。

我需要做的是根据以下条件将数据从col3传输或复制到col2:如果在第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”条件将数据从一列复制到另一列的信息。我发现的唯一一件事是如何使用“合并”功能将整个列从一个数据帧复制到另一个数据帧,但除此之外别无其他。

是否存在可以实现此功能的功能?

1 个答案:

答案 0 :(得分:3)

你的例子是不可复制的,所以我必须自己创建一些:

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