【发布时间】:2021-03-02 12:57:07
【问题描述】:
您好,我有以下数据框
df = rbind(c('John', '1', 'a', 'a'),
c('John', '1', 'a', 'a'),
c('David', '2', 'b', 'b'),
c('David', '2', 'b', 'b'),
c('Jack', '3', 'b', 'b'),
c('Jack', '3', 'b', 'b'),
c('David', '1', 'b', 'b'),
c('Chris', '3', 'b', 'b'),
c('Peter', '4', 'b', 'b')) %>%
data.frame
colnames(df) <- c('name', paste('t', 1:3, sep = ''))
name t1 t2 t3
1 John 1 a a
2 John 1 a a
3 David 2 b b
4 David 2 b b
5 Jack 3 b b
6 Jack 3 b b
7 David 1 b b
8 Chris 3 b b
9 Peter 4 b b
在这里,列 't1' 应该对每个名字都是唯一的 - 所以 1 代表约翰,2 代表大卫,3 代表杰克,等等。所以基本上,如果一个变量,比如 t1 中的 1,对应两个不同的名称,那就错了。 所以我想为 t1 列中的每个数字找到具有 2 个不同名称的行。 在数据框中,John 和 David 对应 1,Jack 和 Chris 对应 3。所以我想检索这些人的行。
我想要这样的输出:
name t1 t2 t3
John 1 a a
David 1 b b
Jack 3 b b
Chris 3 b b
这可以在dplyrtidyverse 或任何基本代码中完成吗?这需要forloops吗?我对 R 很陌生,所以正在寻找简单的方法来实现这一点。
提前致谢!
其他问题:
运行您的代码后,我的原始数据如下所示:
name t1 t2 t3
1 John Doe 1 a a
2 Doe John 1 a a
3 Jone Doe A 1 b b
4 David Freeman 2 b b
5 Freeman David 2 b b
6 Jack Chen 3 b b
7 John Chen 3 b b
8 Chris Baker F 4 b b
9 Baker O Chris 4 b b
正如您所见,所有的名字、中间名和姓氏都混在一起了。 名称格式有太多变化,因此代码将 John Doe、Doe John 和 John Doe A 都视为不同的人。 我的原始数据太大了,我无法手动修复名称。
我想清理这些名称(以便将 John Doe、Doe John 和 John Doe A 视为一个个体,但 Chris Baker F 和 Bake O Chris 应视为两个不同的唯一个体),以便在重新运行我的代码我可以有这样的输出:
name t1 t2 t3
1 Jack Chen 3 b b
2 John Chen 3 b b
3 Chris Baker F 4 b b
4 Baker O Chris 4 b b
这可以使用 R 实现吗?
【问题讨论】:
标签: r dataframe loops if-statement dplyr