【问题标题】:In R from a csv file get rows from a column which contain more then 2 characters在来自 csv 文件的 R 中,从包含超过 2 个字符的列中获取行
【发布时间】:2018-03-21 06:46:34
【问题描述】:

我有一个 csv 文件,我必须从中获取特定列中包含超过 2 个字符的行。我的 csv 文件看起来像这样

"Name" "Age" "ID"     "RefID"
"ABC"  "12"  "Abccc"  "xyzw"
"AAA"  "14"  "A"      "X"
"BBB"  "18"  "DEfff"  "dfg"
"CCY"  "10"  "F"      "XY"
"CCZ"  "20"  "R"      "XYC"

所以从第 3 列和第 4 列中,我选取了 >= 两个字符的行。

我尝试了以下方式

data = read.table(file ='res.csv', header = T)
dat2 = as.character(data[,3])
ind = dat2[(which(nchar(dat2) >=2)),]

但它给了我错误,我无法找出如何同时处理两个 cols。 我的结果应该如下所示

"Name" "Age" "ID"     "RefID"
"ABC"  "12"  "Abccc"  "xyzw"
"BBB"  "18"  "DEfff"  "dfg"
"CCY"  "10"  "F"      "XY"
"CCZ"  "20"  "R"      "XYC"

如有任何帮助,将不胜感激

【问题讨论】:

标签: r character dimensions


【解决方案1】:

我们可以通过在read.table 中指定stringsAsFactors = FALSE 来避免多个步骤,即转换为character 类,以避免将字符列转换为factor 类。然后,用nchar获取第三列的字符数,通过比较是否大于等于2来创建逻辑条件

data[nchar(data[,3])>=2,]
#   Name Age    ID RefID
#1  ABC  12 Abccc  xyzw
#3  BBB  18 DEfff   dfg

对于多列,使用&

data[nchar(data[,3])>=2 & data[,4] >=2,]

但是,当有 100 列时,它会变得有点困难。为此,我们遍历感兴趣的列,进行比较并将Reduce 与单个逻辑vector 进行比较

data[Reduce(`&`, lapply(data[3:4], function(x) nchar(x) >=2)),]
#  Name Age    ID RefID
#1  ABC  12 Abccc  xyzw
#3  BBB  18 DEfff   dfg

如果列的any 的条件需要为TRUE,则将Reduce 中的& 更改为|

data[Reduce(`|`, lapply(data[3:4], function(x) nchar(x) >=2)),]
#   Name Age    ID RefID
#1  ABC  12 Abccc  xyzw
#3  BBB  18 DEfff   dfg
#4  CCY  10     F    XY
#5  CCZ  20     R   XYC

数据

data <- read.table(file ='res.csv', header = TRUE, stringsAsFactors = FALSE) 

【讨论】:

  • 它给了我错误:nchar()' 需要一个字符向量。
  • @KritikaRajain 正如我在帖子中提到的,阅读时使用stringsAsFactors = FALSE。更新了data 步骤
  • 非常感谢,但如果任何一个列具有字符 >=2,我的结果应该有行。
  • @KritikaRajain 更新了帖子
【解决方案2】:

这是一个基于data.table的解决方案。 stringsAsFactors = FALSE 是 data.table::fread 中的默认值。

require(data.table)

x= 
fread('"Name" "Age" "ID"     "RefID"
"ABC"  "12"  "Abccc"  "xyzw"
"AAA"  "14"  "A"      "X"
"BBB"  "18"  "DEfff"  "dfg"
"CCY"  "10"  "F"      "XY"
"CCZ"  "20"  "R"      "XYC"')

x[nchar(ID)>2 | nchar(RefID)>2]

   Name Age    ID RefID
1:  ABC  12 Abccc  xyzw
2:  BBB  18 DEfff   dfg

对于OR (|) 案例,您还可以根据姓名和年龄以及基于 nchar 的子集进行融化。 这是一个单行:

z = melt(x, id.vars = c('Name', 'Age'))[nchar(value) > 2 ]
z 
 Name Age variable value
1:  ABC  12       ID Abccc
2:  BBB  18       ID DEfff
3:  ABC  12    RefID  xyzw
4:  BBB  18    RefID   dfg
5:  CCZ  20    RefID   XYC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2011-12-18
    • 2013-06-01
    相关资源
    最近更新 更多