我想基于两列纬度和经度在R中创建唯一ID,以便重复的位置具有相同的群集ID.
例如:
LAT LONG Cluster_ID
13.5330 -15.4180 1
13.5330 -15.4180 1
13.5330 -15.4180 1
13.5330 -15.4180 1
13.5330 -15.4170 2
13.5330 -15.4170 2
13.5330 -15.4170 2
13.5340 -14.9350 3
13.5340 -14.9350 3
13.5340 -15.9170 4
13.3670 -14.6190 5
Run Code Online (Sandbox Code Playgroud) 我有兴趣去除具有时间固定和时变值的敏感数据集.我想(a)按社会安全号码对所有案件进行分组,(b)为这些案件分配一个唯一的ID,然后(c)删除社会安全号码.
这是一个示例数据集:
personal_id gender temperature
111-11-1111 M 99.6
999-999-999 F 98.2
111-11-1111 M 97.8
999-999-999 F 98.3
888-88-8888 F 99.0
111-11-1111 M 98.9
Run Code Online (Sandbox Code Playgroud)
任何解决方案都将非常感谢.
我有一个如下所示的数据帧(df):
School Student Year
A 10 1999
A 10 2000
A 20 1999
A 20 2000
A 20 2001
B 10 1999
B 10 2000
Run Code Online (Sandbox Code Playgroud)
我想创建一个人ID专栏,以便df看起来像这样:
ID School Student Year
1 A 10 1999
1 A 10 2000
2 A 20 1999
2 A 20 2000
2 A 20 2001
3 B 10 1999
3 B 10 2000
Run Code Online (Sandbox Code Playgroud)
换句话说,ID变量指示它在数据集中的哪个人,同时考虑学生编号和学校会员资格(这里我们总共有3个学生).
df$ID <- df$Student如果c("School", "Student)是唯一的,我做了并试图请求值+1 .它不起作用.帮助赞赏.
这个问题是一种与此相关的一个,但是我想创建使用两种data.frame列的独特组合的指数.所以我的数据结构看起来像这样(dput):
structure(list(avg = c(0.246985988921473, 0.481522354272779,
0.575400762275067, 0.14651009243539, 0.489308880181752, 0.523678968337178
), i_ID = c("H", "H", "C", "C", "H", "S"), j_ID = c("P", "P",
"P", "P", "P", "P")), .Names = c("avg", "i_ID", "j_ID"), row.names = 7:12, class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
因此,上述结构的创建索引应如下所示
1
1
2
2
1
3
Run Code Online (Sandbox Code Playgroud)
在示例数据中,列j_ID始终具有值P,但情况并非总是如此.此外,反之亦然(SP或PS)组合应该产生相同的索引.
有人知道一个很好的方法来实现这一目标吗?我可以用很多for循环和if-else命令来做,但那不是很优雅.
我正在尝试在不使用 for 循环的情况下创建一个唯一的、随机分配的(无替换)组 ID。这是我得到的:
library(datasets)
library(dplyr)
data(iris)
iris <- iris %>% group_by(Species) %>% mutate(id = cur_group_id())
Run Code Online (Sandbox Code Playgroud)
这给了我每个 iris$Species 的组 id,但是,我希望组 id 从 c(1,2,3) 随机分配,而不是根据数据集的顺序分配。
任何帮助创建它都会非常有帮助!我确信有一种方法可以用 dplyr 做到这一点,但我很难过......
我为问题的措辞和错误道歉.操作系统和R中的新手
问题:找到有效的方法来填充列,该数字可以唯一地标识另一列中具有相同值的观察值.结果如下所示:
patient_number id
1 46 1
2 47 2
3 15 3
4 42 4
5 33 5
6 26 6
7 37 7
8 7 8
9 33 5
10 36 9
Run Code Online (Sandbox Code Playgroud)
样本数据框
set.seed(42)
df <- data.frame(
patient_number = sample(seq(1, 50, 1), 100, replace = TRUE)
)
Run Code Online (Sandbox Code Playgroud)
我能想到的是什么
df$id <- NA ## create id and fill with NA make if statement easier
n_unique <- length(unique(df$patient_number)) ## how many unique obs
for (i in 1:nrow(df)) { …Run Code Online (Sandbox Code Playgroud) 我想为每个多列值为数据表的行分配唯一的ID.让我们考虑一个简单的例子:
library(data.table)
DT = data.table(a=c(4,2,NA,2,NA), b=c("a","b","c","b","c"), c=1:5)
a b c
1: 4 a 1
2: 2 b 2
3: NA c 3
4: 2 b 4
5: NA c 5
Run Code Online (Sandbox Code Playgroud)
我想基于列a和b生成ID,并期望获得三个ID,其中第二和第四行ID相同,第三行和第五行也具有相同的ID.
我看过两个解决方案,但每个都略有不完整:
1)解决方案一需要排序数据表,如果我们需要为每个列生成ID(在我的实际应用中,ID是基于大约十列生成的),这非常麻烦.我们可以替换cumsum功能,因此不需要排序吗?
DT$ID1 <- cumsum(!duplicated(DT[,1:2]))
Run Code Online (Sandbox Code Playgroud)
2)解决方案二忽略NA值; 虽然我想包括NA并为他们分配一个组ID
DT <- transform(DT, ID2 = as.numeric(interaction(a,b, drop=TRUE)))
Run Code Online (Sandbox Code Playgroud)
我感谢有关如何修改任一解决方案以生成如下所示的Expected_ID的任何建议.
a b c ID1 ID2 Expected_ID
1: 4 a 1 1 1 1
2: 2 b 2 2 2 2
3: NA c 3 3 NA 3
4: 2 b 4 3 2 2 …Run Code Online (Sandbox Code Playgroud) 自从新的 dplyr v1.0.0 更新出来后,我注意到该功能group_indices()已被...弃用。我在工作中经常使用这个功能,我喜欢在mutate.
例如使用dplyr v0.8.3我能够很容易地做这样的事情:
#注意,我没有运行此代码,因为我的机器上不再有 v0.8.3。
library(dplyr) # v0.8.3
rep_data <- data.frame(
x = c("a", "a", "a", "a", "b", "b", "b", "c"),
y = c("v1", "v1", "v2", "v3", "v1", "v2", "v3", "v3"),
expect_output = c(1, 1, 2, 3, 4, 5, 6, 7)
)
rep_data %>%
mutate(expect_output2 = group_indices(x, y))
Run Code Online (Sandbox Code Playgroud)
expect_output2应该有效地给出与expect_output.
现在...不推荐使用它们,我想不再使用它们,但我不确定如何做与上面相同的事情。
我基本上是在这里问这个问题,但这个问题现在在新dplyr版本中已经过时了。
当我使用上面的代码运行时,dplyr v1.0.0我收到警告消息:
Warning message:
The `...` argument …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用dplyr的 group_by 和 cur_group_id() 函数创建一个 id 列。这很顺利,但是我希望 cur_group_id() 根据分组变量之一“重新启动”。
示例数据:
df <- data.frame(
X = c(1,1,1,1,1,2),
Y = c(1,1,1,2,2,3),
Z = c(1,1,2,3,3,4)
)
# which looks like this
df
X Y Z
1 1 1
1 1 1
1 1 2
1 2 3
1 2 3
2 3 4
Run Code Online (Sandbox Code Playgroud)
我当前的代码和输出:
library(dplyr)
library(magrittr)
df %<>%
group_by(X, Y, Z) %>%
mutate(ID = cur_group_id()) %>%
ungroup()
df
X Y Z ID
1 1 1 1
1 1 1 1
1 …Run Code Online (Sandbox Code Playgroud) 我无法解决这个必须完成的任务。如何获得作为连续数字的组标签。
library(dplyr)
set.seed(1)
df <- data.frame(id = sample(c('a','b'), 20, T),
name = sample(c('N1', 'N2', 'N3'), 20, T),
val = runif(20)) %>%
group_by(id) %>%
arrange(id, name)
Run Code Online (Sandbox Code Playgroud)
我想要的是一个标签group_no,指示name每个iddplyr组中变量的类别数量。我在dplyr软件包本身中找不到解决方案。像这样:
# A tibble: 20 x 4
# Groups: id [2]
id name val group_no
<fct> <fct> <dbl> <int>
1 a N1 0.647 1
2 a N1 0.530 1
3 a N1 0.245 1
4 a N2 0.693 2
5 a N2 0.478 2
6 a N2 0.861 2 …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的矢量:
a <- c("A110","A110","A110","B220","B220","C330","D440","D440","D440","D440","D440","D440","E550")
Run Code Online (Sandbox Code Playgroud)
我想创建另一个基于a的另一个向量,它看起来像:
b <- c(1,1,1,2,2,2,3,4,4,4,4,4,4,5)
Run Code Online (Sandbox Code Playgroud)
换句话说,b应该为a的每个不同元素分配一个值(从1开始).
我有一个非常大的数据框(假设有 8 行 x 10,000 列),其中充满了字符串。我想将每个唯一的字符串转换为数字并用它替换。
例如,如果我有一个数据框:
X1 X2 X3
1 cat mouse rabbit
2 dog cat, dog dog
Run Code Online (Sandbox Code Playgroud)
我想将其转换为:
X1 X2 X3
1 1 2 3
2 4 5 4
Run Code Online (Sandbox Code Playgroud)
请注意,“猫,狗”的组合标签有自己的唯一编号。每个字符串的实际编号是无关紧要的,因为我这样做是为了评估者间的可靠性计算。
如果我没有获得所有独特的元素,为它们分配一个数字并替换,是否有更优雅的方法来做到这一点?
另外,如果元素中的值为空,例如“”,则应将其转换为数字 DF 中的 NA。