【发布时间】:2021-10-16 06:25:05
【问题描述】:
我最近询问如何使用字典文件来重新编码数据集中的值 (Working with data values (dictionary). dataframes and recoding in R)
我遇到了一个更简单的问题,但该修复不起作用。假设我有以下数据集,每一行都是一个地理单位,V1 列列出了地理包找到的“第一个邻居”,但使用行号列出它 :
V1 <- c(1, 2, 1)
id <- c(110001, 110002, 110003)
dataset <- as.data.frame(matrix(c(id, V1), ncol=2))
colnames(dataset) <- c("id", "V1")
所以在这个数据集上,区域 110001 是它自己的邻居 (V1 = 1),区域 110003 是 110001 (V1 = 1) 的邻居。
现在,我不想将 V1(第一个邻居)显示为 "1, 2, 1",而是将其显示为地理区域的 id,"110001, 110002, 110001"。
所以,我创建了一个“字典”文件,其中包含地理区域的行号和 id:
dictionary <- as.data.frame(matrix(c(dataset$id, 1:nrow(dataset)),ncol=2))
colnames(dictionary) <- c("id","row")
然后,我尝试使用 mutate 映射这些。请注意,我有许多邻域变量(V1-V30),而我在示例中只使用了一个,所以我将使用转换为所有的语法:
new_dataset <- dataset %>% mutate(across(starts_with("V"), ~subset(dictionary, row == cur_column(), select= id)))
这应该做的是:跨列运行,将值与字典行中的值进行比较,然后返回适当的 id。似乎问题在于dataset$V1 中的重复条目(在此示例中,第 1 行和第 3 行等于“1”)。如果我逐行进行,这将起作用:
first_row <- dataset[1,] %>% mutate(V1 = subset(dictionary, row == V1, select= id))
second_row <- dataset[2,] %>% mutate(V1 = subset(dictionary, row == V1, select= id))
third_row <- dataset[3,] %>% mutate(V1 = subset(dictionary, row == V1, select= id))
我的印象是“子集”忽略了重复的条目。例如,如果我运行这个:
subset(dictionary, row == dataset$V1, select= id)
它应该返回"110001, 110002, 110001",但只返回"110001, 110002"。
关于如何让子集返回所有内容或其他方法的任何想法?
【问题讨论】:
-
只是一个提示:
data.frame(id, V1)是一种更方便的方式来定义该 data.frame。你不需要那种matrix()+colnames()方式。 -
为什么
V1 == 1被110001取代而不是110003? -
谢谢马丁!所以,
V1 == 1映射到字典中的row == 1值,等于110001 -
@akrun 抱歉,我误点击了解决方案按钮,而不是点赞按钮。我刚刚开始测试解决方案,然后才接受它们。
-
是的,我觉得很有趣,但不能太确定在线
标签: r dataframe subset matching