在来自csv文件的R中,从列中获取包含多于2个字符的行

时间:2018-03-21 06:46:35

标签: r character dimensions

我有一个csv文件,我必须从中获取来自特定coloumn的超过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"

任何帮助都是适当的

2 个答案:

答案 0 :(得分:2)

我们可以避免多个步骤,即通过在character中指定stringsAsFactors = FALSE来转换为read.table类,以避免将字符列转换为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) 

答案 1 :(得分:0)

这是一个基于data.table的解决方案。 stringsAsFactors = FALSEdata.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