第一列中有一个缺少值的表格。 第一和第二列之间有关系,即 第一列中有一个唯一的名称,对应于第二列中的许多ID。
例如:
NAME列中的NA需要替换为其列(A或B或C)中的现有值之一。通过第二列中的ID进行选择。
例如,第一个NA具有ID3。在表中查找,ID3对应于A,因此NA将替换为A。
第三列在这一步上没有任何作用,但我在以后的操作中也将需要它。
这是当前的外观:
NAME | ID | Value
A | ID1 | V1
A | ID2 | V2
A | ID3 | V3
B | ID4 | V4
C | ID5 | V5
C | ID6 | V6
NA | ID3 | V7
NA | ID1 | V8
NA | ID5 | V9
NA | ID4 | V10
NA | ID5 | V11
这是它的外观
Name | ID | Value
A | ID1 | V1
A | ID2 | V2
A | ID3 | V3
B | ID4 | V4
C | ID5 | V5
C | ID6 | V6
A | ID3 | V7
A | ID1 | V8
C | ID5 | V9
B | ID4 | V10
C | ID5 | V11
我在dplyr和数据表的不同方法之间陷入了困境,无法取得任何进展。 关于我如何继续前进的任何想法? 谢谢。
答案 0 :(得分:1)
这是一个<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">x</button>
</div>
<div class="modal-body">
<div id="map"></div>
</div>
<div class="modal-footer">
</div>
解决方案:
$("#map_modal").find(".modal-content").html("<%= j (render 'map_modal', locals: { account: @account }) %>");
$("#map_modal").modal();
$('#map_modal').on('shown.bs.modal', function (e) {
handler = Gmaps.build('Google');
handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
markers = handler.addMarkers(<%=raw @hash.to_json %>);
handler.bounds.extendWith(markers);
handler.fitMapToBounds();
handler.getMap().setZoom(12);
});
});
注意:
这也将与因子变量一起使用。
对于您发布的特定示例,您实际上并不需要dplyr
,但这是一个更一般的情况(即,如果您有多个行用于特定的ID和非library(dplyr)
# example data
dt = read.table(text = "
NAME ID Value
A ID1 V1
A ID2 V2
A ID3 V3
B ID4 V4
C ID5 V5
C ID6 V6
NA ID3 V7
NA ID1 V8
NA ID5 V9
NA ID4 V10
NA ID5 V11
", header=T, stringsAsFactors=F)
dt %>%
group_by(ID) %>% # for each ID
mutate(NAME = unique(NAME[!is.na(NAME)])) %>% # get the non-NA value of NAME
ungroup() # forget the grouping
# # A tibble: 11 x 3
# NAME ID Value
# <chr> <chr> <chr>
# 1 A ID1 V1
# 2 A ID2 V2
# 3 A ID3 V3
# 4 B ID4 V4
# 5 C ID5 V5
# 6 C ID6 V6
# 7 A ID3 V7
# 8 A ID1 V8
# 9 C ID5 V9
#10 B ID4 V10
#11 C ID5 V11
NAME值)。>
答案 1 :(得分:0)
首先,您必须以某种方式将数据输入R。此过程超出了答案的范围。
temp
# NAME ID Value
# 1 A ID1 V1
# 2 A ID2 V2
# 3 A ID3 V3
# 4 B ID4 V4
# 5 C ID5 V5
# 6 C ID6 V6
# 7 <NA> ID3 V7
# 8 <NA> ID1 V8
# 9 <NA> ID5 V9
# 10 <NA> ID4 V10
# 11 <NA> ID5 V11
以下解决方案不使用dplyr
,仅使用带有do.call
的基本R。
temp2 <- table (temp$NAME, temp$ID)
temp2
# ID1 ID2 ID3 ID4 ID5 ID6
# A 1 1 1 0 0 0
# B 0 0 0 1 0 0
# C 0 0 0 0 1 1
您不能直接使用该表。首先,必须将其转换为数据框。
temp3 <- as.data.frame.matrix(temp2)
temp3
# ID1 ID2 ID3 ID4 ID5 ID6
# A 1 1 1 0 0 0
# B 0 0 0 1 0 0
# C 0 0 0 0 1 1
例如,您要将ID5对应的NA替换为“ C”。
rownames (temp3[which(temp3$ID5 == 1),])
# [1] "C"
现在让我们将其放入函数中。
returnName <- function (df, id)
{
rowTemp <- do.call ('$', list(df, id))
name <- rownames (df[which(rowTemp == 1),])
return (name)
}
temp$NAME <- sapply (temp$ID, returnName, df = temp3)
temp
# NAME ID Value
# 1 A ID1 V1
# 2 A ID2 V2
# 3 A ID3 V3
# 4 B ID4 V4
# 5 C ID5 V5
# 6 C ID6 V6
# 7 A ID3 V7
# 8 A ID1 V8
# 9 C ID5 V9
# 10 B ID4 V10
# 11 C ID5 V11