在一个数据框中连接三个因子列

时间:2016-06-06 09:12:20

标签: r

我有一个类似下面的通用数据集的数据集,并希望将三个sitevariables合并为一个。

-bash-4.1$ ps -ef | grep gradle
11831    26400  1920 19 15:33 pts/1    00:00:03 /opt/jdk1.7.0_10//bin/java -Dorg.gradle.appname=gradle -classpath /DATA/maas_slave/tools/hudson.plugins.gradle.GradleInstallation/gradle-2.13-rc-1/lib/gradle-launcher-2.13-rc-1.jar org.gradle.launcher.GradleMain --no-daemon zipAlign
11831    26440 26400 20 15:33 pts/1    00:00:03 /opt/jdk1.7.0_10/bin/java -Xmx2048M -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp /DATA/maas_slave/tools/hudson.plugins.gradle.GradleInstallation/gradle-2.13-rc-1/lib/gradle-launcher-2.13-rc-1.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.13-rc-1

我希望获得的数据框应该是这样的:

-bash-4.1$ ps -ef | grep gradle
11831     1918  1920 26 15:50 pts/1    00:00:02 /opt/jdk1.7.0_10//bin/java -Dorg.gradle.daemon=false -Dorg.gradle.appname=gradle -classpath /DATA/maas_slave/tools/hudson.plugins.gradle.GradleInstallation/gradle-2.13-rc-1/lib/gradle-launcher-2.13-rc-1.jar org.gradle.launcher.GradleMain zipAlign
11831     1962  1918 29 15:50 pts/1    00:00:02 /opt/jdk1.7.0_10/bin/java -Xmx2048M -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp /DATA/maas_slave/tools/hudson.plugins.gradle.GradleInstallation/gradle-2.13-rc-1/lib/gradle-launcher-2.13-rc-1.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.13-rc-1

我尝试在sqldf包中使用coalesce,它提供正确的输出,但str()显示输出是一个带有一个变量的数据框。而不是我需要的一系列因素。

 df <- data.frame(var1 = c("site1", NA, NA, NA, "site3", "site4"),
                  var2 = c(NA, NA, "NA", "site2", NA, "site4"),
                  var3 = c("site1", NA, "Site2", "site2", "site3", NA))

   var1  var2  var3
1 site1  <NA> site1
2  <NA>  <NA>  <NA>
3  <NA>    NA Site2
4  <NA> site2 site2
5 site3  <NA> site3
6 site4 site4  <NA>

5 个答案:

答案 0 :(得分:2)

您可以使用na.locf包中的zoo来获取var4,

library(zoo)
df$var4 <- na.locf(t(df))[ncol(df),]
df
#   var1  var2  var3  var4
#1 site1  <NA> site1 site1
#2  <NA>  <NA>  <NA>  <NA>
#3  <NA>    NA Site2 Site2
#4  <NA> site2 site2 site2
#5 site3  <NA> site3 site3
#6 site4 site4  <NA> site4

答案 1 :(得分:2)

另一个选择是使用这样的东西:

cd /path/to/my/repo
git check-ignore -v -- .gitignore

输出如下:

df$var4 <- apply(df, 1, min, na.rm = TRUE)

答案 2 :(得分:1)

您可以使用cbind()合并两个数据框,如:

 error: no matching function for call to ‘std::vector<int>::erase(__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type&)’
    t.erase(t.at(i));

然后通过

更改colname
tmp = sqldf("select coalesce(var1, var2, var3) from df")
df = cbind(df, tmp)

答案 3 :(得分:1)

也许这可能是一个可能的解决方案:

colnames(df)[4] = 'var4'

请注意,最后一列是字符向量,但您可以根据需要轻松转换为因子(使用df<- data.frame(var1 = c("site1", NA, NA, NA, "site3", "site4"), var2 = c(NA, NA, "NA", "site2", NA, "site4"), var3 = c("site1", NA, "Site2", "site2", "site3", NA)) getLastNonNA <- function(v){ notNAs <- !is.na(v) if(!any(notNAs)) return(NA) tail(v[notNAs],1) } # if you prefer the first non-NA #getFirstNonNA <- function(v){ # notNAs <- !is.na(v) # if(!any(notNAs)) # return(NA) # head(v[notNAs],1) #} df$var4 <- apply(df,1,getLastNonNA) > df var1 var2 var3 var4 1 site1 <NA> site1 site1 2 <NA> <NA> <NA> <NA> 3 <NA> NA Site2 Site2 4 <NA> site2 site2 site2 5 site3 <NA> site3 site3 6 site4 site4 <NA> site4 )。

答案 4 :(得分:1)

我们可以使用max.col

df$var4 <- df[cbind(1:nrow(df), max.col(!is.na(df), "first"))]
df
#   var1  var2  var3  var4
#1 site1  <NA> site1 site1
#2  <NA>  <NA>  <NA>  <NA>
#3  <NA>  <NA> Site2 Site2
#4  <NA> site2 site2 site2
#5 site3  <NA> site3 site3
#6 site4 site4  <NA> site4