我需要根据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
答案 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
”。