R 基于不同列值但在同一行中选择数据集

R 基于不同列值但在同一行中选择数据集,r,R,我有一个大约有80列和1000行的数据集,该数据集的示例如下: ID gend.y gend.x Sire Dam Weight 1 M F Jim jud 220 2 F F josh linda 198 3 M NA Claude Bere 200 4 F M John Mary 350 5 F F Peter Lucy 298 我需

我有一个大约有80列和1000行的数据集,该数据集的示例如下:

ID gend.y gend.x Sire   Dam    Weight 
1   M      F     Jim    jud    220 
2   F      F     josh   linda  198
3   M      NA    Claude Bere   200
4   F      M     John   Mary   350
5   F      F     Peter  Lucy   298
我需要选择gend.y和gend.x之间不同的所有信息,如下所示:

ID gend.y gend.x Sire   Dam    Weight 
1   M      F     Jim    jud    220 
3   M      NA    Claude Bere   200
4   F      M     John   Mary   350
记住,我还需要选择另外76列

我试过这个命令:

library(dplyr)
new.file=my.file %>%
  filter(gend.y != gend.x)
但是不要工作。此时将显示以下消息:

Error in Ops.factor(gend.y, gend.x) : level sets of factors are different

正如@divibisan所说:“仍然不是一个可重复的例子,但错误会让你更接近。这两个变量是因子,因子的解释取决于代码和“levels”属性。只需小心将因子与同一组水平进行比较(顺序相同)。您可能希望在比较之前将其转换为字符,或修复要匹配的级别。“

所以我做了这个(将它们转换为字符):

在我使用新变量(现在已转换为字符)运行上一个命令之后:


现在我的工作和我预期的一样。Credits@divibisan

正如@divibisan所说:“这仍然不是一个可复制的例子,但错误会让你更接近。这两个变量是因子,因子的解释取决于代码和“levels”属性。只需小心将因子与同一组水平进行比较(顺序相同)。您可能希望在比较之前将其转换为字符,或修复要匹配的级别。“

所以我做了这个(将它们转换为字符):

在我使用新变量(现在已转换为字符)运行上一个命令之后:



现在我的工作和我预期的一样。Credits@divibisan

应该可以,但如果没有错误消息和可复制的数据示例,就无法知道原因。请使用
dput
功能将数据的一部分输出到您的问题中,这仍然不是一个可复制的示例,但错误会让您更接近。这两个变量是因子,
因子的解释取决于代码和“levels”属性。请注意只比较具有相同级别集(顺序相同)的因素。
您可能希望在比较之前将其转换为
字符
,或者修复级别以匹配。可能重复@divibisan,我试图回答我的问题。我很感激你能提出改进的建议。谢谢,很乐意帮忙。如果这个复制品解决了你的问题,我相信你可以按下一个按钮,接受它为复制品。这将帮助找到这个问题的其他人找到他们需要的答案。这应该是可行的,但如果没有错误信息和可复制的数据示例,就无法知道原因。请使用
dput
功能将数据的一部分输出到您的问题中,这仍然不是一个可复制的示例,但错误会让您更接近。这两个变量是因子,
因子的解释取决于代码和“levels”属性。请注意只比较具有相同级别集(顺序相同)的因素。
您可能希望在比较之前将其转换为
字符
,或者修复级别以匹配。可能重复@divibisan,我试图回答我的问题。我很感激你能提出改进的建议。谢谢,很乐意帮忙。如果这个复制品解决了你的问题,我相信你可以按下一个按钮,接受它为复制品。这将帮助找到此问题的其他人获得他们需要的答案。无需使用
格式
format
仅指定在使用
print
命令时应如何显示这些数字,它不会更改变量的格式。只需将
作为.character
就足够了。我不知道为什么,但是如果我不使用
format
,该命令会忽略一些应该考虑的行。您无法将任何内容与
NA
进行比较,因为
NA
缺少数据。所以任何东西都是
!=NA
==NA
始终返回
NA
:如果没有要比较的数据,比较没有任何意义。如果要选择具有
NA
值的行,则需要添加
is.NA
测试:
filter(new.gend.y!=new.gend.x | is.NA(new.gend.y!=new.gend.x))
效果更好,如果数据确实丢失,您如何知道第3行的
gend.x
不同?它也可以是
M
,在这种情况下,您希望排除该行。如果它只是另一个不同的值,则应将其从
NA
更改为特定值格式所做的是将实际值转换为打印字符串。以后它会把事情搞得一团糟,所以我不会依赖它。添加
is.na
检查,或者使用适当的、不丢失的值替换
na
值(如果该值适合您的数据),无需使用
格式
format
仅指定在使用
print
命令时应如何显示这些数字,它不会更改变量的格式。只需将
作为.character
就足够了。我不知道为什么,但是如果我不使用
format
,该命令会忽略一些应该考虑的行。您无法将任何内容与
NA
进行比较,因为
NA
缺少数据。所以任何东西都是
!=NA
==NA
始终返回
NA
:如果没有要比较的数据,比较没有任何意义。如果要选择具有
NA
值的行,则需要添加
is.NA
测试:
filter(new.gend.y!=new.gend.x | is.NA(new.gend.y!=new.gend.x))
效果更好,如果数据确实丢失,您如何知道第3行的
gend.x
不同?它也可以是
M
,在这种情况下,您希望排除该行。如果它只是另一个不同的值,则应将其从
NA
my.file$new.gend.y=as.character(my.file$gend.y)
my.file$new.gend.x=as.character(my.file$gend.x)
library(dplyr)
new.file=my.file %>%
  filter(new.gend.y != new.gend.x | is.na(new.gend.y != new.gend.x))