1

我最近开始使用 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”条件将数据从一列复制到另一列的信息。我发现的唯一一件事是如何使用“合并”功能将一整列从一个数据帧复制到另一个数据帧,但除此之外别无其他。

是否存在可以完成此任务的功能?

4

1 回答 1

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   
于 2012-11-16T13:51:20.950 回答