R编程:逻辑数据帧到实际数据帧

时间:2018-01-31 04:50:13

标签: r dataframe dplyr

我需要根据R中的逻辑数据帧转换或操作记录。  我希望与原始数据帧匹配,并仅填充原始数据帧中等于true的值,并为false值填充null,并同时维护数据帧结构。请建议

例如:

原始数据框

ID Name Title
1 John Mr
2 Mike Mr
3 Susan Dr

逻辑数据帧

ID Name Title
False False False 
False True False 
False False True

预期数据框

ID Name Title
2 Mike <null>
3 <null> Dr

1 个答案:

答案 0 :(得分:0)

这是一个镜头:

orig <- read.table(text="ID Name Title
1 John Mr
2 Mike Mr
3 Susan Dr", header = TRUE, stringsAsFactors = FALSE)
lgl <- read.table(text="ID Name Title
False False False 
False True False 
False False True", header = TRUE, stringsAsFactors = FALSE)

newdf <- mapply(function(d,l) { d[!l] <- NA; d; }, orig, lgl)
newdf
#      ID Name   Title
# [1,] NA NA     NA   
# [2,] NA "Mike" NA   
# [3,] NA NA     "Dr" 
newdf[ rowSums(!is.na(newdf)) > 0, ]
#      ID Name   Title
# [1,] NA "Mike" NA   
# [2,] NA NA     "Dr" 

您的预期输出不一致,因为FALSE列中有$ID,但您将其保留在输出中。您可以通过将其更改为TRUE并将过滤器更改为rowSums(!is.na(newdf)) > 1来解决此问题。

<强>解释

  • mapply在一个或多个列表上运行一个函数(命名或匿名),如“zipper”函数。那就是:

    mapply(func, 1:3, 4:6, 7:9, SIMPLIFY=FALSE)
    

    相当于

    list(func(1,4,7), func(2,5,8), func(3,6,9))
    
  • !is.na(newdf)创建具有相同维度/名称的data.frame,但所有元素均为logical

  • 因为通常sum(<logical_vector>)返回一个元素为真的单个整数,rowSums(...)返回一个向量,每行一个元素,其中每个元素是“trues”的数量那一行。

  • ... > 0返回逻辑向量,仅传递至少有一个非NA元素的行。

你说你想要永远保留$ID。在这种情况下,您可能想要(在处理之前):

lgl$ID <- TRUE

并将条件更改为... > 1至我“至少两个非NA元素,其中一个我们知道ID

相关问题